2014-03-26 3 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

문제는 절대로 작업을 시작하지 않는다는 것입니다. 시작되지 않은 작업을 대기열에 넣은 다음 시작하지 않은 작업을 꺼낼 때 대기합니다.

그런데, 나는 그저 하나의 작은 변화를 만들지 말라고했다. 일반적으로, 시작되지 않은 작업을 처리하는 것은 오류가 발생하기 쉽습니다. Task 개체 대신 엔 큐브 Action 개체를 사용하는 것이 좋습니다. 대기열에서 작업을 가져 오면 실행하거나 비동기를 유지하려면 Task.Run을 사용하여 다른 스레드에서 실행합니다.

또한 ProccessTasksTask.Run으로 호출 할 필요가 없습니다. 이미 비동기식이므로 백그라운드 스레드에서 실행할 필요가 없습니다.