gpt4 book ai didi

c# - ThreadPool - WaitAll 64 句柄限制

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:47 25 4
gpt4 key购买 nike

我试图绕过 .net 3.5 强加的 wait64 句柄限制

我看过这个帖子:Workaround for the WaitHandle.WaitAll 64 handle limit?

所以我理解了总体思路,但我遇到了困难,因为我没有使用委托(delegate),而是使用了

我基本上是在处理这个例子: http://msdn.microsoft.com/en-us/library/3dasc8as%28VS.80%29.aspx

此链接http://www.switchonthecode.com/tutorials/csharp-tutorial-using-the-threadpool类似,但跟踪任务的 int 变量也是一个成员变量。

在上面的例子中,我应该在哪里传递 threadCount 整数?我是否将它作为对象传递到回调方法中?我想我在回调方法和引用传递方面遇到了问题。

谢谢斯蒂芬,

我不太清楚这个链接。

让我发布我的代码来帮助自己澄清:

for (int flows = 0; flows < NumFlows; flows++)
{
ResetEvents[flows] = new ManualResetEvent(false);
ICalculator calculator = new NewtonRaphson(Perturbations);
Calculators[flows] = calculator;
ThreadPool.QueueUserWorkItem(calculator.ThreadPoolCallback, flows);
}
resetEvent.WaitOne();

我将在哪里传递我的 threadCount 变量。我假设它需要在 calculator.ThreadPoolCallback 中递减?

最佳答案

您不应使用多个等待句柄来等待 ThreadPool 中多个工作项的完成。它不仅不可扩展,您最终会遇到 WaitHandle.WaitAll 方法强加的 64 个句柄限制(正如您已经完成的那样)。在这种情况下使用的正确模式是计数等待句柄。 Reactive Extensions 中有一个可用通过 CountdownEvent 下载 .NET 3.5类。

var finished = new CountdownEvent(1);
for (int flows = 0; flows < NumFlows; flows++)
{
finished.AddCount();
ICalculator calculator = new NewtonRaphson(Perturbations);
Calculators[flows] = calculator;
ThreadPool.QueueUserWorkItem(
(state) =>
{
try
{
calculator.ThreadPoolCallback(state);
}
finally
{
finished.Signal();
}
}, flows);
}
finished.Signal();
finished.Wait();

关于c# - ThreadPool - WaitAll 64 句柄限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3152624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com