我需要按顺序处理任务。所以这个类订阅了一些事件。在处理事件时,必须将异步方法添加到队列中,并可能在之前所有任务完成后执行。此时它是这样实现的:但是当firs事件被引发时,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());
}
}发布于 2014-03-26 22:40:06
问题是你永远不会开始你的任务,永远不会。您将未启动的任务放入队列中,然后在将其拉出时等待未启动的任务。
话虽如此,我还是不鼓励你只做一个小小的改变。通常,如您所见,处理未启动的任务非常容易出错。我建议使用Action对象而不是Task对象。当您将操作从队列中拉出时,您可以执行它,或者如果您想保持异步,可以使用Task.Run在另一个线程中运行它。
您也不需要使用Task.Run调用ProccessTasks。它已经是异步的,所以不需要在后台线程中运行它。
https://stackoverflow.com/questions/22661979
复制相似问题