2016-08-03 3 views
1

Мой код продолжает выполняться до того, как все задачи будут выполнены.Задание. После завершения работы до завершения Задачи

Я посмотрел на других людей с аналогичной проблемой, но не вижу ничего очевидного!

static Task MoveAccountAsync(MoverParams moverParams) 
    { 
     return Task.Run(() => 
     { 
      Console.WriteLine("Moving {0}", moverParams.Account.Name); 
      moverParams.Account.Mover.RefreshRoom(); 
      moverParams.Account.Mover.PathfindTo(moverParams.Room); 
     }); 

    } 

static async void MoveAccountsAsync(List<Account> accounts, int room) 
    { 

     List<Task> theTasks = new List<Task>(); 

     foreach (Account account in accounts) 
     { 
      // Create a new task and add it to the task list 
      theTasks.Add(MoveAccountAsync(new MoverParams(account, room))); 
     } 

     await Task.WhenAll(theTasks); 
     Console.WriteLine("Finished moving."); 
    } 

Тогда просто назвав его от статического основной:

MoveAccountsAsync(theAccounts, room); 

Помощь высоко ценится!

Приветствие, Dave

+1

Вы не можете ждать метода 'async void'. Это огонь и забыть. Всегда используйте «async Task», кроме обработчиков событий. Изнутри 'Main()' use '.Wait()' в результате 'Task'. –

ответ

3

async void метода весьма обескуражены и часто (например, здесь) знак вопроса.

Потому что вы не ожидаете своего вызова метода (и вы не можете await, потому что он возвращает void), вызывающий не будет ждать завершения всей работы, прежде чем перейти к следующему утверждению.

Измените способ, чтобы вернуть Task и await, чтобы устранить эту проблему. Если вы звоните в MoveAccountsAsync из синхронного контекста (например, Main), используйте Wait, чтобы подождать по результатам. Но имейте в виду, что в определенных условиях (например, если они выполняются как часть приложения ASP.NET), которые могут вызвать взаимоблокировки.

+0

Итак, мне нужно создать еще одну задачу, которая порождает дочерние задачи? Затем дождитесь завершения основной задачи вместо ожидания дочерних задач? Извиняюсь, что это мой первый опыт работы с потоками! – DavidC799

+0

'Задача'! = Тема. Выполнение задачи, которую вы ожидаете, не означает, что там есть новый поток. Просто, что есть какая-то работа, которая происходит, и вы ждете ее завершения. – MarcinJuraszek

+0

Упс! Так что я сказал правильно? Я попытался: «Task.Run (() => MoveAccountsAsync (theAccounts, room)). Wait();' при вызове, но с теми же результатами, что и раньше ... – DavidC799

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