方法的BeginInvoke
和实际调用存在延迟。
在我的代码中,我在for循环中使用delegate.BeginInvoke
调用方法,在for循环之后有代码等待所有线程完成。
for(count=0;count<4; Count;count++)
{
MethodDelegatedglt;
dglt = new MethodDelegate(this.ProcessResponse);
asyncResult = dglt.BeginInvoke(Param1, null, null);
wHandle.Add(asyncResult.AsyncWaitHandle);
}
logMessage( GUIDSessionXML + " Waiting on all threads to complete.", LogLevel.Debug);
正如您在上面的代码中看到的那样,代理是在第1行定义的,第2行是它的分配。 在第3行进行异步调用并在waithandle数组中添加。
下面我正在等待所有等待句柄完成
if (!System.Threading.WaitHandle.WaitAll(wHandle, connectionTimeOut, false) )
{
...
}
从日志中我知道,只要我们调用BeginInvoke
,就不会调用该方法,但是有延迟。
2014-06-20 15:19:42.6104 => Waiting on all threads to complete.
2014-06-20 15:19:44.4044 => Start of ProcessResponse.
正如您所见,上述方法在将近2秒后被调用。
这背后可能是什么原因以及如何解决这个问题,我们将不胜感激。
答案 0 :(得分:0)
创建新线程时,线程池可能很懒惰。新的线程创建可以延迟最多500ms(有关更多详细信息,请查看Joe Duffy的"CLR thread pool injection, stuttering problems")。
要解决此问题,请使用ThreadPool.SetMinThreads
增加预分配线程的数量。
最有可能的是,您应该重新评估应用程序的设计,并考虑使用一些现代并行编程技术:Task Parallel Library (TPL)(包括Dataflow),async/await
,{{3} }。