2014-10-28 2 views
0

Я тестирую асинхронный/ждущий и вот проблема. Я запускаю две задачи асинхронно и ожидаю завершения их выполнения. Я ожидаю, что две задачи будут ждать соответствующих задержек, а затем вернутся к печатным итоговым миллисекундам. Но программа печатает только 1 start " + current time и 2 start " + current time, но после этого ничего не происходит. Как я могу вернуться из заданий с задержкой и распечатать окончательный результат?Task.Delay не возвращается в основной поток

static void Main(string[] args) 
    { 
     RunTasksWithDelays(); 
    } 

    static async void RunTasksWithDelays() 
    { 
     Stopwatch s = Stopwatch.StartNew(); 

     Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 
     Task task1 = LongRunningTask1(); 
     Task task2 = LongRunningTask2(); 

     await Task.WhenAll(task1, task2); 
     Console.WriteLine("total milliseconds elapsed: " + s.ElapsedMilliseconds/1000); 

    } 

    static async Task LongRunningTask1() 
    { 
     Console.WriteLine("1 start " + DateTime.Now); 
     await Task.Delay(5000); 
     Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 
     Console.WriteLine("1 end " + DateTime.Now); 

    } 

    static async Task LongRunningTask2() 
    { 
     Console.WriteLine("2 start " + DateTime.Now); 
     await Task.Delay(2000); 
     Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 
     Console.WriteLine("2 end " + DateTime.Now); 

    } 

ответ

4

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

В идеале вы должны быть в ожидании RunTasksWithDelays метод, но вы не можете ждать его по двум причинам

  1. Ваш метод не возвращает Task
  2. Main метод не поддерживает await.

Вы должны сделать метод RunTasksWithDelays возвращения async Task, а не async void, и вы должны ждать его завершения. Ожидание синхронно - плохая идея, это хорошо в этом сценарии, поскольку у нас нет выбора.

static void Main(string[] args) 
{ 
    RunTasksWithDelays().Wait(); 
} 

static async Task RunTasksWithDelays() 
{ 
    ... 
} 
+0

Это работает. Я знал, что мне нужно подождать, но не знаю, как это сделать в Майн. – Sam

+0

Есть ли способ узнать, сколько потоков было порождено во время полного выполнения? – Sam

+0

@Sam Нет, нет. Операция могла быть завершена без какой-либо одной нити или N числа потоков. Невозможно узнать (AFAIK). –

2

Ваш метод RunTasksWithDelays должен возвращать Задачу для вызывающего абонента ждать эту задачу, чтобы закончить.

Тогда вы можете просто позвонить RunTasksWithDelays().Wait();

+1

«RunTasksWithDelays» - это метод пустоты. –

+0

Хороший улов, я видел ключевое слово async и мой мозг вставил Задачу. –

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