2014-11-29 4 views
1

Я пытаюсь поднять голову и асинхронно, поэтому я написал это небольшое тестовое приложение, но ожидаемого я не ожидал.Задача не дожидаясь завершения

Вместо того, чтобы ждать завершения задачи, программа продолжает выполнять.

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 

Если я своп 'ждут задания' за '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- и-await.html), которые могут оказаться полезными. Обратите внимание, что ваш код [не должен использовать конструктор задачи] (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

Это происходит потому, что когда у вас есть асинхронный метод void, вы ничего не можете сделать, чтобы отслеживать его завершение. Ваш new Task(Run) создает задачу для запуска метода Run. После того, как Run прибывает с первого раза, ничто не отслеживает ход метода, потому что ничего не связано с прогрессом метода. Чтобы исправить это, вы должны вернуть Task вместо void и ждать, что вместо создания новой задачи.

Разница между async void и async Task описана here.

Смежные вопросы