我有几个想要在后台执行的动作,但它们必须一个接一个地同步执行。使用Task.ContinueWith创建执行队列?
我想知道是否使用Task.ContinueWith方法来实现这一点是个好主意。你有没有预见到这个问题?
我的代码看起来是这样的:
private object syncRoot =new object();
private Task latestTask;
public void EnqueueAction(System.Action action)
{
lock (syncRoot)
{
if (latestTask == null)
latestTask = Task.Factory.StartNew(action);
else
latestTask = latestTask.ContinueWith(tsk => action());
}
}
一个改进是围绕ConcurrentQueue使用BlockingCollection。然后可以派发一个Task/Worker线程,该线程只使用foreach对阻塞集合进行操作。 foreach将“挂起”,直到将新项目添加到队列中,或者在阻塞集合上调用CompleteAdding()。 –