我需要按顺序处理任务。所以这个班级订阅了一些活动。
处理事件时,必须将异步方法添加到Queue,并且可能在所有先前任务完成时执行。此时它被实现为:
但是当引发第一个事件时,ProccessTasks
方法停止工作。
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());
}
}
答案 0 :(得分:1)
问题是你永远不会开始你的任务。您将未启动的任务放入队列中,然后在将它们拉出时等待未启动的任务。
话虽如此,我会劝阻你只做一个小改动。一般来说,正如您所见,处理未启动的任务相当容易出错。我建议对Action
个对象进行排队,而不是Task
个对象。当您将操作拉出队列时,您可以执行它,或者如果您想要保持异步,请使用Task.Run
在另一个线程中运行它。
您也无需使用ProccessTasks
致电Task.Run
。它已经是异步的,所以不需要在后台线程中运行它。