【发布时间】:2016-09-19 22:21:02
【问题描述】:
我有一个可以由多个线程填充的作业队列 (ConcurrentQueue<MyJob>)。我需要异步(不是通过主线程)实现这些作业的连续执行,但只能由一个线程同时执行。我尝试过这样的事情:
public class ConcurrentLoop {
private static ConcurrentQueue<MyJob> _concurrentQueue = new ConcurrentQueue<MyJob>();
private static Task _currentTask;
private static object _lock = new object();
public static void QueueJob(Job job)
{
_concurrentQueue.Enqueue(job);
checkLoop();
}
private static void checkLoop()
{
if ( _currentTask == null || _currentTask.IsCompleted )
{
lock (_lock)
{
if ( _currentTask == null || _currentTask.IsCompleted )
{
_currentTask = Task.Run(() =>
{
MyJob current;
while( _concurrentQueue.TryDequeue( out current ) )
//Do something
});
}
}
}
}
}
我认为这段代码有一个问题:如果任务完成执行(TryDequeue 返回 false,但任务尚未被标记为已完成)并且此时我得到一个新工作,它将不会被执行。我对吗?如果是这样,如何解决这个问题
【问题讨论】:
-
您尝试限制线程数是否有真正的原因?最好让框架大部分时间为你处理优化
-
对要由一个线程一次执行的代码块使用锁定。这应该可以解决问题。
-
锁定
ConcurrentQueue?我相信有更好的方法 -
@konkked,是的。
-
@xalz ...好吧,那是什么?
标签: c# multithreading task-parallel-library concurrent-collections