2017-11-06 6 views
1

이벤트를 큐에 넣고 병렬로 실행해야합니다.ThreadPool misses events

My C# 코드는 이벤트를 차단 컬렉션에 대기시키고 ThreadPool을 사용하여 작업자 스레드에서 각 이벤트를 실행합니다. 그러나 이벤트가 2,000 이벤트/초 이상의 속도로 대기열에 있으면 일부 이벤트가 누락됩니다.

이 문제를 스레드에서 스레드에 따라 악화, 들어오는 요청을 만들려면 :이 문제를 검색 할 때, 나는 어떤 스레드를 사용할 수없는 경우 ThreadPool이이 this link에서 어떤 요청을 거부하거나 저장할 수 있다는 것을 발견 수영장이 보류 될 수있다 또는 스레드 풀은 들어오는 요청을

주를 처리하기 위해 함께 사용 가능한 스레드가 없을 수 있습니다 주로하기 때문에 을 거부 될 수 있습니다하십시오 코어 i5와 노트북을 사용하는 경우에만이 문제가 나타납니다, Core i7을 사용해 보았을 때 제대로 작동했습니다.

다음은 코드 조각입니다 :

public static void ExecuteEvents() 
{ 
    foreach (EventData data in blockingCollection.GetConsumingEnumerable()) 
    { 
     switch (data.EventType) 
     { 
      case EventType1: 
       ThreadPool.QueueUserWorkItem(o => 
       { 
        Function1(data); 
       }); 
       break; 
      case EventType2: 
       ThreadPool.QueueUserWorkItem(o => 
       { 
        Function2(data); 
       }); 
      default: 
       break; 
     } 
    } 
} 
+3

'ThreadPool'에 의해 거부 된 작업 항목에 대해 들어 본 적이 없습니다. 다른 것 같네요. –

+0

다른 원인에 대해 어떻게 생각하십니까? @ JeroenvanLangen –

+0

당신의 신비한 사라지는 것들이 eventtyp1 또는 2가 아니라고 결정한 경우에 대비하여 로그인을 시도해 보셨습니까? – BugFinder

답변

3

당신이 스레드에 문제가있는 것처럼 그것은 보이지 않는다. 종결에 문제가있는 것 같습니다.

루프 내에서 로컬 변수를 먼저 만들어야합니다. 문제는 스레드 풀이 작업을 실행할 때 지속적으로 변경되는 EventData data 변수를 참조하는 것입니다. 따라서 먼저 로컬 변수를 만들어야합니다. (지역 변수가 범위 밖으로 목록에 넣어하는 방법에서 참조되기 때문에하는 displayclass에 포장 될 것이다.)

public static void ExecuteEvents() 
{ 
    foreach (EventData data in blockingCollection.GetConsumingEnumerable()) 
    { 
     var local = data; 
     switch (local.EventType) 
     { 
      case EventType1: 
       ThreadPool.QueueUserWorkItem(o => 
       { 
        Function1(local); 
       }); 
       break; 
      case EventType2: 
       ThreadPool.QueueUserWorkItem(o => 
       { 
        Function2(local); 
       }); 
      default: 
       break; 
     } 
    } 
} 

을 폐쇄에 대한 추가 정보를 원하시면 보기 here

+0

나는 그것을 시도했지만 여전히 작동하지 않습니다. –

+1

OP가 C# 3.0 또는 이전 버전 인 경우이 내용이 적용됩니다. 그들의 의견에 따라 C# 4.0+를 사용하는 경우 변경되지 않습니다. – Servy