【发布时间】:2010-11-05 23:15:06
【问题描述】:
有没有更好的方法在执行另一个进程之前等待排队的线程?
目前我在做:
this.workerLocker = new object(); // Global variable
this.RunningWorkers = arrayStrings.Length; // Global variable
// Initiate process
foreach (string someString in arrayStrings)
{
ThreadPool.QueueUserWorkItem(this.DoSomething, someString);
Thread.Sleep(100);
}
// Waiting execution for all queued threads
lock (this.workerLocker) // Global variable (object)
{
while (this.RunningWorkers > 0)
{
Monitor.Wait(this.workerLocker);
}
}
// Do anything else
Console.WriteLine("END");
// Method DoSomething() definition
public void DoSomething(object data)
{
// Do a slow process...
.
.
.
lock (this.workerLocker)
{
this.RunningWorkers--;
Monitor.Pulse(this.workerLocker);
}
}
【问题讨论】:
-
有很多方法。我认为您需要阅读良好的线程指南-albahari.com/threading。生产者消费者队列在您的场景中可能很有用,Wait and pulse 或 WaitHandles 也可能有用。 ——
-
这一行存在竞态条件:this.RunningWorkers--;尝试使用 Interlocked.Decrement 方法进行线程安全减量。
-
@SolutionYogi: RunningWorkers 受锁保护(this.workerLocker)
标签: c# multithreading queue