delegate.begininvoke和实际调用的延迟

时间:2014-06-20 12:35:15

标签: c# asynchronous

方法的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秒后被调用。

这背后可能是什么原因以及如何解决这个问题,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

创建新线程时,线程池可能很懒惰。新的线程创建可以延迟最多500ms(有关更多详细信息,请查看Joe Duffy的"CLR thread pool injection, stuttering problems")。

要解决此问题,请使用ThreadPool.SetMinThreads增加预分配线程的数量。

最有可能的是,您应该重新评估应用程序的设计,并考虑使用一些现代并行编程技术:Task Parallel Library (TPL)(包括Dataflow),async/await,{{3} }。