c# – 单线程上的线程WaitHandle
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 单线程上的线程WaitHandle,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1831字,纯文字阅读大概需要3分钟。
内容图文
![c# – 单线程上的线程WaitHandle](/upload/InfoBanner/zyjiaocheng/808/746bb96f710d4d098a05565583368485.jpg)
我的代码是
public static void Invoke(Action[] Actions)
{
Thread[] threadArray = new Thread[Actions.Length];
for (int i = 0; i < Actions.Length; i++)
{
threadArray[i] = new Thread(() =>
{
Actions[i].Invoke();
});
threadArray[i].Start();
}
}
public static void WaitAll()
{
}
public static void WaitAny()
{
}
我想等待所有线程完成,并在任何线程完成时收到通知,
喜欢WaitAny,WaitAll
但是waithandles只能在线程池上使用,找不到任何在单线程上使用的示例.
我的应用程序需要很多线程,数百个,theadpool有最大线程限制,休息任务排队.
我该如何管理?
更新:这是代码,如果有更好的代码,请告诉我.
public class ParallelV2
{
static int waitcount = 0;
static WaitHandle[] waitHandles;
public static void Invoke(Action[] Actions)
{
waitcount = Actions.Length;
Thread[] threadArray = new Thread[Actions.Length];
waitHandles = new WaitHandle[Actions.Length];
for (int i = 0; i < Actions.Length; i++)
{
var count = i;
waitHandles[count] = new AutoResetEvent(false);
threadArray[count] = new Thread(() =>
{
Actions[count].Invoke();
((AutoResetEvent)waitHandles[count]).Set();
});
threadArray[count].Start();
}
}
public static void WaitAll()
{
while (waitcount > 0)
{
WaitHandle.WaitAny(waitHandles);
waitcount--;
}
}
public static void WaitAny()
{
WaitHandle.WaitAny(waitHandles);
}
}
解决方法:
在下面的示例中,我需要跟踪三个线程.每个线程完成后都会设置相应的句柄.
声明如下:
private WaitHandle[] waithandles; // see comment on static below
像这样创建它:
waitcount = 3;
waithandles = new WaitHandle[3] { new AutoResetEvent(false), new AutoResetEvent(false), new AutoResetEvent(false) };
在线程中,当它完成时,设置如下:
((AutoResetEvent)waithandles[i]).Set();
(实际上,这会过度简化,但是如果你使waithandle静态的话它会起作用.我实际上做的是让线程在其生命结束时执行回调来发出waithandle信号)
在主线程中,请检查它.当waitcount达到零时,我知道所有线程都已完成
while (waitcount > 0)
{
WaitHandle.WaitAny(waithandles, 30000);
waitcount--;
}
内容总结
以上是互联网集市为您收集整理的c# – 单线程上的线程WaitHandle全部内容,希望文章能够帮你解决c# – 单线程上的线程WaitHandle所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。