gpt4 book ai didi

c# - WaitAll 和完成事件的线程问题 - 信号触发异常

转载 作者:太空狗 更新时间:2023-10-30 01:09:31 26 4
gpt4 key购买 nike

我正在使用线程池来(毫不奇怪)管理一组线程。我想做的是让他们在完成后发出信号,我有:

ManualResetEvent[] doneEvents = new ManualResetEvent[char_set.Length];

public struct string_char
{
public string[] _str_char;
public ManualResetEvent _doneEvent;

public string_char(string[] str_char, ManualResetEvent doneEvent)
{
_str_char = str_char;
_doneEvent = doneEvent;
}
}

我在这里有一个循环,它创建一个 char 数组,然后我创建一个我的结构实例来填充该 char 数组和一个完成事件:

doneEvents[no_of_elements - 1] = new ManualResetEvent(false);
string_char s_c = new string_char(array_holder, doneEvents[no_of_elements - 1]);
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, s_c);

所以,线程被创建,添加到池中,它愉快地开始运行,当它完成时它设置完成事件:

public void ThreadPoolCallback(Object s_c)
{
string_char _s_c = (string_char)s_c;
//do the calculations...
//when done:
_s_c._doneEvent.Set();
}

回到主循环,代码在这里等待:

WaitHandle.WaitAll(doneEvents);
Console.WriteLine("All calculations are complete.");

问题是我一直收到异常:

'WaitAll for multiple handles on a STA thread is not supported.'

我已经在谷歌上查过了,但它并没有真正帮助,我做错了什么。这基本上是 ms msdn 示例的重复,除了我使用的是结构而不是类之外?

我解决了这个问题,使用下面的建议,主要是切换到 MTA(doh!);了解最大值为 64 个线程数也很有用。所以我将不得不切换到不同的等待模型,因为最终的应用程序将运行更多!很多东西要学。

谢谢。

最佳答案

以这种方式使用 WaitHandle.WaitAll 有几个问题。你已经发现了其中之一。另一个是它的可扩展性不是很好,因为它有 64 个句柄限制。这是我用来等待多个工作项完成的模式。它使用 CountdownEvent 类。

using (var finished = new CountdownEvent(1))
{
foreach (var workItem in workItemCollection)
{
var captured = item;
finished.AddCount();
ThreadPool.QueueUserWorkItem(
(state) =>
{
try
{
ProcessWorkItem(captured);
}
finally
{
finished.Signal();
}
}, null);
}
finished.Signal();
finished.Wait();
}

关于c# - WaitAll 和完成事件的线程问题 - 信号触发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6512413/

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