Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Task.When在任务完成之前完成所有任务_C#_.net_Asynchronous - Fatal编程技术网

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);