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()); 
    } 
} 
+3

看看BlockingCollection:http://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx –

+5

...或更好的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

+0

@spender所以,我正在为Windows RT编写应用程序,它没有System.Threading.Tasks.Dataflow –

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

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

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