问候
我有一个程序,该程序创建一个类的多个实例,在所有实例上运行相同的长时间运行的Update方法,并等待完成。我遵循的是Kev从this question开始将更新添加到ThreadPool.QueueUserWorkItem
的方法。
在主程序中,我睡了几分钟,检查最后一个孩子中的布尔值,看是否完成
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 OS)具有许多专门设计用于防止需要自旋锁的线程原语,并且
Sleep
的轮询循环实际上只是一个缓慢的自旋锁。关于c# - 一劳永逸的C#改进,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2553895/