【问题标题】:C# Queue of TasksC# 任务队列
【发布时间】:2014-03-26 13:05:37
【问题描述】:

我需要按顺序处理任务。所以这个类订阅了一些事件。 处理事件时,必须将异步方法添加到队列中,并且可能在之前的所有任务完成后执行。此时实现如下: 但是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());
    }
}

【问题讨论】:

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


【解决方案1】:

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

话虽如此,我还是劝你不要只做那一点小小的改变。通常,如您所见,处理未开始的任务相当容易出错。我建议排队 Action 对象而不是 Task 对象。当您从队列中拉出操作时,您可以执行它,或者如果您想保持异步,请使用Task.Run 在另一个线程中运行它。

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

【讨论】: