2012-02-06 2 views
5

NetTcpBinding 서비스와 BasicHttpBinding 서비스를 사용하여 응용 프로그램을 만듭니다. 이러한 서비스를 통해 클라이언트는 응용 프로그램에 요청을 보냅니다. 이러한 요청은 Queue 개체 (인바운드 요청 큐)에 저장해야합니다.다중 스레드로 큐에 동시 액세스

  1. 두 서비스 모두 클라이언트의 동시 호출을 허용해야합니다.
  2. 이는 두 서비스가 수신 된 요청을 추가하기 위해 대기열에 동시에 액세스해야 함을 의미합니다.
  3. 또한 요청을 처리하기 위해 다른 스레드가 큐에 액세스해야합니다.

나는 ConcurrencyMode.Multiple을 사용할 수 있으며 동시에 많은 전화가 걸릴 수 있습니다. 그러나 이것이 큐에 대한 동시 액세스를 보장하지는 않습니다. 두 개의 다른 스레드에 두 ServiceHost을 넣어야합니까? 예 :

  • 첫 번째 스레드는 대기열에서 요청을 대기열에서 제외하고 처리합니다.
  • 두 번째 스레드는 NetTcpBinding 서비스를 인스턴스화하고 큐에 새 요청을 대기열에 포함시킵니다. 또한 콜백을 통해 응답을 보냅니다.
  • 세 번째 스레드는 BasicHttpBinding 서비스를 인스턴스화하고 큐에 새 요청을 대기열에 포함시킵니다.

이것은 제 생각입니다. 나는 거의 초보자이기 때문에, 조언을 해줄 수 있다면 감사 할 것입니다. 아마도 큐에 동시에 액세스하는 세 개의 스레드를 작성해야합니다. 즉, 처음 두 스레드가 큐에 임의의 요청을 대기열에 넣을 수 있으며 세 번째 스레드는 이러한 요청을 사용합니다.

+2

대기열에 묶여 있습니까? ConcurrentQueue 또는 BlockingCollection을 사용할 수 있습니까? 이것은 꽤 표준적인 생산자/소비자 문제입니다. – Joe

+0

@Joe : 지금은'Queue','Dictionary' 등의 스레드로부터 안전하지 않은 컬렉션을 사용해야합니다. – enzom83

+0

특별한 이유는 무엇입니까? 휠을 다시 구현하는 것뿐입니다. – Joe

답변

3

당신 이후 "나는 거의 새내기"라고 자신을 특징 짓는다. 좀 더 일반적인 읽기 - Threading in C# Joseph Albahari 무료 온라인 기사/책을 제안 해 줄 것이다. C#의 스레드 및 스레드 문제를 철저히 검토합니다.

파트 3과 파트 4 (및 파트 1과 2 검토)를주의 깊게 읽으면 현재 문제뿐만 아니라 다른 문제도 해결할 수 있습니다. 멀티 스레딩.

질문에 대한 답을 원하면 Yahia의 대답을 따르십시오.

9

.NET 4의 경우 ConcurrentQueue<T>BlockingCollection을 조사해야합니다.

바스케이프는 고성능을 위해 구현되고 대부분 잠금이 해제 된 스레드로부터 안전한 컬렉션입니다.

BlockingCollection은 사용자가 설명하는 것과 같은 Producer-Consumer-Scenarios에 대해 구체적으로 구현됩니다. 참조 참조

: