【发布时间】:2018-09-19 12:17:36
【问题描述】:
我将来自 UI 线程的任务放入队列中,以便它们可以在另一个线程中处理。如果无事可做,线程应该等待 AutoResetEvent - 显然所有这些都应该是线程安全的。
我将任务从 UI 线程放入队列中,如下所示:
lock (_syncObject)
{
_queue.Enqueue(new FakeTask());
}
_autoResetEvent.Set();
到目前为止,我的处理线程循环如下所示:
while (true)
{
FakeTask task = null;
lock (_syncObject)
{
if (_queue.Count > 0)
{
task = _queue.Dequeue();
}
}
if (task != null)
{
task.Run();
Thread.Sleep(1000); //just here for testing purposes
}
if (_queue.Count == 0)
{
_autoResetEvent.WaitOne();
}
}
我担心我检查队列中是否有其他东西的最后一部分不是线程安全的,我想知道我是如何做到的。谢谢!
【问题讨论】:
-
您可以使用ConcurrentQueue 而不是自己处理锁
-
一开始我也想过
ConcurrentQueue,但是这个不就是锁了Enqueue和Dequeue的方法吗?我仍然会错过在最后两行之间添加一些东西的竞态条件? -
如果您使用
TryPeek而不是计数。您也可以查看Producer Consumer pattern using the Dataflow library,看看是否更适合您的需求 -
看看专门为此目的设计的
BlockingCollection。
标签: c# .net multithreading thread-safety