c# – WaitAll和done事件的线程问题 – 信号触发异常
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – WaitAll和done事件的线程问题 – 信号触发异常,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1791字,纯文字阅读大概需要3分钟。
内容图文
![c# – WaitAll和done事件的线程问题 – 信号触发异常](/upload/InfoBanner/zyjiaocheng/799/b04669249712411a9dbb158830b76e76.jpg)
我正在使用线程池(毫不奇怪)管理一组线程.我要做的是让他们在完成后发出信号,我有:
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数组,然后我创建一个我的struct的实例填充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和done事件的线程问题 – 信号触发异常全部内容,希望文章能够帮你解决c# – WaitAll和done事件的线程问题 – 信号触发异常所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。