2014-11-29 2 views
1

기다리고 비동기로 돌아가려고 노력 중이므로이 작은 테스트 앱을 작성했지만 예상치 못한 일은 발생하지 않았습니다.작업 완료를 기다리는 중임이 없습니다.

작업 완료를 기다리는 대신 프로그램이 계속 실행됩니다. 나는이 'task.Await()'에 대한 '작업을 기다리고 있습니다'교체하면 내가 때문이다

Starting 
End 
Run finished 
Main finished 
+0

이 링크가 도움이되기를 바랍니다 http://stackoverflow.com/a/9519578/2798643 –

+0

[async intro blog post] (http://blog.stephencleary.com/2012/02/async- and-await.html)을 참조하십시오. 코드 [task 생성자를 사용해서는 안됩니다.] (http://blog.stephencleary.com/2014/05/a-tour-of-task-part-1-constructors.html) [또는 Task.Factory. StartNew'] (http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html) (두 블로그 링크). –

답변

4

생산이 예상 한 것처럼

class Program 
{ 
    static void Main(string[] args) 
    { 
     var task = new Task(Run); 
     task.Start(); 
     task.Wait(); 

     Console.WriteLine("Main finished"); 
     Console.ReadLine(); 
    } 

    public async static void Run() 
    { 
     var task = Task.Factory.StartNew(() => 
     { 
      Console.WriteLine("Starting"); 
      Thread.Sleep(1000); 
      Console.WriteLine("End"); 
     }); 

     await task; 
     Console.WriteLine("Run finished"); 
    } 
} 

출력

Main finished 
Starting 
End 
Run finished 

는 그 다음에 실행 비동기식 인 void 메서드를 사용하면 완료 추적을 할 수있는 방법이 없습니다. 귀하의 new Task(Run)은 Run 메서드를 시작하기위한 작업 만 생성합니다. Run이 처음 도착한 후에 메소드의 진행 상황을 추적 할 수있는 방법은 없습니다. 메소드 진행 상황과 관련이 없기 때문입니다. 이 문제를 해결하려면 void 대신 Task을 반환해야하며 새 작업을 만드는 대신 기다려야합니다.

async voidasync Task의 차이는 here으로 설명됩니다.

관련 문제