首页 / C# / c# – Join和WaitAll的比较
c# – Join和WaitAll的比较
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Join和WaitAll的比较,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1572字,纯文字阅读大概需要3分钟。
内容图文
对于多线程等待,任何人都可以比较使用WaitHandle.WaitAll和Thread.Join的利弊吗?
解决方法:
WaitHandle.WaitAll有64个句柄限制,所以这显然是一个巨大的限制.另一方面,它是一种仅在一次通话中等待许多信号的便捷方式. Thread.Join不需要创建任何其他WaitHandle实例.由于它可以在每个线程上单独调用,因此64个句柄限制不适用.
就个人而言,我从未使用过WaitHandle.WaitAll.当我想等待多个信号时,我更喜欢更具伸缩性的模式.您可以创建一个向上或向下计数的计数机制,一旦达到特定值,您就会发出单个共享事件的信号. CountdownEvent类可以方便地将所有这些打包成一个类.
var finished = new CountdownEvent(1);
for (int i = 0; i < NUM_WORK_ITEMS; i++)
{
finished.AddCount();
SpawnAsynchronousOperation(
() =>
{
try
{
// Place logic to run in parallel here.
}
finally
{
finished.Signal();
}
}
}
finished.Signal();
finished.Wait();
更新:
您想要从主线程发出事件信号的原因很微妙.基本上,您希望将主线程视为仅仅是另一个工作项.它毕竟与其他实际工作项一起同时运行.
考虑一下,如果我们不将主线程视为工作项,可能会发生什么.它将经历for循环的一次迭代并为我们的事件添加计数(通过AddCount),表明我们有一个待处理的工作项吗?让我们说SpawnAsynchronousOperation完成并获取在另一个线程上排队的工作项.现在,想象一下主线程在转向循环的下一次迭代之前是否被抢占.执行工作项的线程获得其公平的CPU份额并开始哼唱并实际完成工作项.工作项中的Signal调用运行并将我们的待处理工作项计数减少到零,这将更改CountdownEvent的状态以发信号通知.与此同时,主线程唤醒并经历循环的所有迭代并触及Wait调用,但由于事件过早地发出信号,即使仍有待处理的工作项,它也会被传递.
再次,当您将主线程视为工作项时,避免这种微妙的竞争条件很容易.这就是为什么CountdownEvent初始化为一个计数,并且在Wait之前调用Signal方法.
内容总结
以上是互联网集市为您收集整理的c# – Join和WaitAll的比较全部内容,希望文章能够帮你解决c# – Join和WaitAll的比较所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。