假设有很多线程调用Do(),只有一个工作线程处理实际工作。
void Do(Job job)
{
concurrentQueue.Enqueue(job);
// wait for job done
}
void workerThread()
{
while (true)
{
Job job;
if (concurrentQueue.TryDequeue(out job))
{
// do job
}
}
}
Do() 应该等到作业完成后再返回。所以我写了下面的代码:
class Task
{
public Job job;
public AutoResetEvent ev;
}
void Do(Job job)
{
using (var ev = new AutoResetEvent(false))
{
concurrentQueue.Enqueue(new Task { job = job, ev = ev }));
ev.WaitOne();
}
}
void workerThread()
{
while (true)
{
Task task;
if (concurrentQueue.TryDequeue(out task))
{
// do job
task.ev.Set();
}
}
}
经过一些测试,我发现它按预期工作。但是我不确定这是分配许多 AutoResetEvents 的好方法,还是有更好的方法来完成?
ABOUTYOU
Smart猫小萌
吃鸡游戏
相关分类