我有一个可以由多个线程(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,但任务尚未标记为已完成)并且此时我得到了一份新工作,它将不会被执行。我对吗?如果是这样,如何解决这个问题