C#任务队列

时间:2014-03-26 13:05:37

标签: c# windows-store-apps scheduled-tasks async-await

我需要按顺序处理任务。所以这个班级订阅了一些活动。 处理事件时,必须将异步方法添加到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());
    }
}

1 个答案:

答案 0 :(得分:1)

问题是你永远不会开始你的任务。您将未启动的任务放入队列中,然后在将它们拉出时等待未启动的任务。

话虽如此,我会劝阻你只做一个小改动。一般来说,正如您所见,处理未启动的任务相当容易出错。我建议对Action个对象进行排队,而不是Task个对象。当您将操作拉出队列时,您可以执行它,或者如果您想要保持异步,请使用Task.Run在另一个线程中运行它。

您也无需使用ProccessTasks致电Task.Run。它已经是异步的,所以不需要在后台线程中运行它。