C#队列任务
问题描述:
我需要按顺序处理任务。所以这个班级订阅了一些活动。 处理事件时,必须将异步方法添加到队列中,并且可能会在所有先前的任务完成时执行。此时它实现为: 但是当引发第一个事件时,ProccessTasks
方法停止工作。C#队列任务
public class class view
{
private void ModelUpdatedEventHandler(object sender, EventArgs args)
{
taskQueue.Enqueue(new Task(() => Invalidate()));
}
private void MoveCubesEventHandler(object sender, MoveCheckerEventArgs args)
{
taskQueue.Enqueue(new Task(() => MoveCube(args.Move)));
}
private async Task Invalidate()
{
//code here
}
public async Task MoveChecker(Move move)
{
//code here
}
private async Task ProccessTasks()
{
while (true)
{
while (taskQueue.Count > 0)
{
Task task = taskQueue.Dequeue();
await task;
}
}
}
private async void UserControl_Loaded_1(object sender, RoutedEventArgs e)
{
await Task.Run(() => ProccessTasks());
}
}
答
问题是,你永远不会开始你的任务。您将未分离的任务放入队列中,然后在您将它们拉出时等待未分离的任务。
话虽如此,我会阻止你只做一个小小的改变。正如你所看到的,一般来说,处理未启动的任务相当容易出错。我会建议排队Action
对象而不是Task
对象。当您将操作拉出队列时,您可以执行该操作,或者如果要保持异步,请使用Task.Run
在另一个线程中运行该操作。
您也不需要使用Task.Run
致电ProccessTasks
。它已经是异步的了,所以不需要在后台线程中运行它。
看看BlockingCollection:http://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx –
...或更好的TPL DataFlow:http:// msdn。 microsoft.com/en-us/library/hh228603%28v=vs.110%29.aspx它很适合我:http://*.com/questions/7863573/awaitable-task-based-queue?rq=1 – spender
@spender所以,我正在为Windows RT编写应用程序,它没有System.Threading.Tasks.Dataflow –