2013-02-01 2 views
1

ThreadPoolQueueUserWorkItem 메서드를 사용하려고하는데 위임 메서드를 전달하려고하면 몇 가지 문제가 있습니다. 내 코드가있는 문제는 내 대리인을 설정 한 방식에 있다고 생각하지만 Google에서 검색 한 후에도이를 파악할 수는 없습니다.대리인과 함께 ThreadPool 사용?

나는 그렇게처럼 내 대리자를 만드는거야 :

public delegate void GetLatencyDelegate(Server server); 

내가 서버 목록을 통해 루프를 시도하고 서버 GetLatency 방법을 실행하고 있습니다. 새 서버로 루프 할 때마다 GetLatency 메서드를 실행하기 위해 풀에서 새 스레드를 실행해야합니다. 아이디어는 이것이 프로세스를 가속화해야한다는 것입니다. 이에 대한 내 코드는 다음과 같습니다.

  ThreadPool.SetMaxThreads(50, 50); 

      foreach (Server server in serverList) 
      { 
       GetLatencyDelegate gld = new GetLatencyDelegate(server.GetLatency); 
       ThreadPool.QueueUserWorkItem(new WaitCallback(gld)); 

      } 

그러나 두 개의 오류가 발생합니다. 하나 개의 존재 :

" 'GetLatencyDelegate'일치를위한 과부하가 위임하지 'System.Threading.WaitCallback'

또 다른 존재 : GetLatency '일치

'없음 과부하 ' 위임자 'Program.GetLatencyDelegate'

+0

을 시도'ThreadPool.QueueUserWorkItem ((p) => 새로운 WaitCallback (GLD)); ' – sll

+0

글쎄 하나는 server.GetLatency와 동일한 서명의 void GetLatencyDelegate (서버 서버) 때문입니다. 그렇지 않으면 작동하지 않을 것입니다. 2 대리자를 호출하면 스레드 풀에 인수가 전달되지 않습니다. ThreadPool.QueueUserWorkItem (새 WaitCallback (ThreadProc), 서버); – TYY

+0

왜 작업을 사용하지 않습니까? –

답변

3

첫 번째 오류는 WaitCallback의 서명은 GetLatencyDelegate의 서명과 동일하지 않습니다. 둘은 동일해야합니다.

두 번째 오류는 Server.GetLatencyGetLatencyDelegate와 호환 서명이 없기 때문에 발생합니다 후자의 Server 인스턴스에 전달 될 것으로 예상하면서 전자는 어떤 매개 변수를 허용하지

는 사실 절대적으로 필요가 없습니다. 먼저 GetLatencyDelegate을 정의하십시오. 당신은 단순히 WaitCallback 호환 서명 된 람다를 제공 할 수

foreach (Server server in serverList) 
{ 
    ThreadPool.QueueUserWorkItem(srv => ((Server)srv).GetLatency(), server); 
} 
+0

위임자 정의에 따르면'GetLatency' 메서드는'Server' 매개 변수를 사용합니다. –

+0

건배, 완벽하게 작동합니다. –

0

을 다음과 같이하십시오 :

ThreadPool.SetMaxThreads(50, 50); 

foreach (Server server in serverList) 
{ 
    ThreadPool.QueueUserWorkItem(state => 
    { 
     var srv = ((Server)state); 
     srv.GetLatency(srv); 
    }, server); 
}