2016-08-03 140 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); 

帮助非常感谢!

干杯,戴夫

+1

您无法等待'async void'方法。它是随时可以忘记的。除了事件处理程序外,总是使用'async Task'。在Main()中使用'.Wait()'作为结果的'Task'。 –

回答

3

async void方法是非常灰心,很多时候(例如这里)问题的迹象。

因为您不在等待您的方法调用(并且您不能等待await,因为它返回void)调用方将不会等待所有工作完成,然后再转到下一个语句。

改变你的方法返回Taskawait它来解决这个问题。如果您从同步上下文中调用MoveAccountsAsync(例如Main方法),请使用Wait来等待结果。但请注意,在某些情况下(例如,如果作为ASP.NET应用程序的一部分运行)可能导致死锁。

+0

所以我必须创建另一个产生子任务的任务?然后等待主任务完成而不是等待子任务?道歉这是我第一次使用线程! – DavidC799

+0

'任务'!=线程。有一个任务,你在等待并不意味着有一个新的线程。只是有一些正在发生的工作,而您正在等待它完成。 – MarcinJuraszek

+0

糟糕!那么我说的是正确的?我试过:'Task.Run((=)=> MoveAccountsAsync(theAccounts,room))。Wait();'当调用时,但结果与之前一样... – DavidC799