2014-03-26 196 views
0

我需要按順序處理任務。所以這個班級訂閱了一些活動。 處理事件時,必須將異步方法添加到隊列中,並且可能會在所有先前的任務完成時執行。此時它實現爲: 但是當引發第一個事件時,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://stackoverflow.com/questions/7863573/awaitable-task-based-queue?rq=1 – spender

+0

@spender所以,我正在爲Windows RT編寫應用程序,它沒有System.Threading.Tasks.Dataflow –

回答

1

問題是,你永遠不會開始你的任務。您將未分離的任務放入隊列中,然後在您將它們拉出時等待未分離的任務。

話雖如此,我會阻止你只做一個小小的改變。正如你所看到的,一般來說,處理未啓動的任務相當容易出錯。我會建議排隊Action對象而不是Task對象。當您將操作拉出隊列時,您可以執行該操作,或者如果要保持異步,請使用Task.Run在另一個線程中運行該操作。

您也不需要使用Task.Run致電ProccessTasks。它已經是異步的了,所以不需要在後臺線程中運行它。