C# Task.When在任务完成之前完成所有任务
在所有任务完成之前,我的代码将继续执行 我看过其他有类似问题的人,但看不到任何明显的问题C# Task.When在任务完成之前完成所有任务,c#,.net,asynchronous,C#,.net,Asynchronous,在所有任务完成之前,我的代码将继续执行 我看过其他有类似问题的人,但看不到任何明显的问题 static Task MoveAccountAsync(MoverParams moverParams) { return Task.Run(() => { Console.WriteLine("Moving {0}", moverParams.Account.Name); moverParams.Account
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.");
}
非常感谢您的帮助
干杯,
Dave
异步void
方法非常不受鼓励,并且经常(例如,此处)出现问题的迹象
因为您没有等待方法调用(并且您不能等待它,因为它返回void
),所以调用者不会等待所有工作完成后再转到下一个语句
更改方法以返回Task
并等待it来解决问题。如果从同步上下文(例如Main
方法)调用MoveAccountsAsync
,请使用Wait
等待结果。但请注意,在某些情况下(例如,如果作为ASP.NET应用程序的一部分运行),可能会导致死锁。您不能等待异步void
方法。这是火和遗忘。始终使用异步任务
,事件处理程序除外。在Main()
中,对生成的任务使用.Wait()
。因此我必须创建另一个生成子任务的任务?然后等待主任务完成,而不是等待子任务完成?抱歉,这是我第一次使用线程<代码>任务
!=线等待一项任务并不意味着有一个新的线程。只是有一些工作正在进行,你正在等待它完成。哎呀!我说的对吗?我试过:Task.Run(()=>MoveAccountsAsync(theAccounts,room)).Wait()代码>调用时,但结果与以前相同…明白了!谢谢你的帮助。
MoveAccountsAsync(theAccounts, room);