作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问候
我有一个程序创建一个类的多个实例,在所有实例上运行相同的长时间运行的 Update 方法并等待完成。我从 this question 开始关注 Kev 的方法将更新添加到 ThreadPool.QueueUserWorkItem
。
在主程序中,我睡了几分钟,然后检查最后一个子项中的 bool 值以查看是否完成
while(!child[child.Length-1].isFinished) {
Thread.Sleep(...);
}
此解决方案按我想要的方式工作,但有更好的方法吗?既针对独立实例,也检查是否所有工作都已完成。
谢谢
更新:不需要锁定。每个不同的实例都有不同的 web 服务 url,它们从中请求,并对响应执行类似的工作。他们都在做自己的事情。
最佳答案
如果您知道将执行的操作数,请使用倒计时和事件:
Activity[] activities = GetActivities();
int remaining = activities.Length;
using (ManualResetEvent finishedEvent = new ManualResetEvent(false))
{
foreach (Activity activity in activities)
{
ThreadPool.QueueUserWorkItem(s =>
{
activity.Run();
if (Interlocked.Decrement(ref remaining) == 0)
finishedEvent.Set();
});
}
finishedEvent.WaitOne();
}
不要轮询是否完成。 .NET Framework(以及一般的 Windows 操作系统)有许多线程原语,专门设计用于防止自旋锁的需要,并且带有 Sleep
的轮询循环实际上只是一个缓慢的自旋锁。
关于即发即弃的 C# 改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2553895/
我是一名优秀的程序员,十分优秀!