猿问

C# - 如何等待任务和为变量赋值

我现在一直试图弄清楚这一点,但我似乎无法理解它。我有以下异步任务,它从名为“c”的 ClientFunctions 对象中调用其他异步任务。


public async Task RunAsync(Dictionary<int, Robots> botList)

{

    this.botList = botList;

    Task[] tasks = new Task[botList.Count]; //5 tasks for each bot, 5 bots total in a list


    for (int i = 0; i < botList.Count; i++)

    {

        tasks[i] = botList[i].c.StartClient();

        await tasks[i];


        tasks[i] = botList[i].c.setConnection();

    }

    await Task.WhenAll(tasks);

    Form1.Log("All done");

}

我等待之后,StartClient()因为它将数据写入共享文件,并setConnection()从该文件中读取数据。我对所有 5 个机器人都这样做。


该StartClient()函数返回一个进程,我想将该进程存储在每个机器人的类中的一个名为“ proc ”的变量中。


在仍然能够使用任务数组等待所有 5 个完成的同时,我将如何存储结果?


谢谢。


米琪卡哇伊
浏览 448回答 2
2回答

互换的青春

这是一种可能的实现,假设您想按顺序在所有机器人上,StartClient然后调用它们来完成。setConnectionawaitpublic async Task RunAsync(Dictionary<int, Robots> botList){&nbsp; &nbsp; this.botList = botList;&nbsp; &nbsp; var tasks = new List<Task>();&nbsp; &nbsp; foreach(var botKvp in botList)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var bot = botKvp.Value;&nbsp; &nbsp; &nbsp; &nbsp; bot.proc = await bot.c.StartClient();&nbsp; &nbsp; &nbsp; &nbsp; tasks.Add(bot.c.setConnection());&nbsp; &nbsp; }&nbsp; &nbsp; await Task.WhenAll(tasks);&nbsp; &nbsp; Form1.Log("All done");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}Task有两个品种:Task和Task<T>。您有一个Task未定义返回值的数组。如果你想返回一个值,你需要await一个Task<T>. 例如,如果setConnection()应该返回 abool那么它的签名应该声明为public Task<bool> setConnection(...)Task[] tasks = new Task<Process>[botList.Count]应该Task<Process>[] tasks = new Task<Process>[botList.Count]这有效bot.proc = await bot.c.StartClient();因为StartClient()返回Task<Process>并await等待该任务并将进程分配给proc. 作为反例,这将失败:Task procTask = bot.c.StartClient();bot.proc = await procTask

收到一只叮咚

当您等待任务时,您会得到结果,因此:public async Task RunAsync(Dictionary<int, Robots> botList){&nbsp; &nbsp; this.botList = botList;&nbsp; &nbsp; Task[] tasks = new Task[botList.Count]; //5 tasks for each bot, 5 bots total in a list&nbsp; &nbsp; for (int i = 0; i < botList.Count; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; tasks[i] = botList[i].c.StartClient();&nbsp; &nbsp; &nbsp; &nbsp; botList[i].proc = await tasks[i];&nbsp; &nbsp; &nbsp; &nbsp; tasks[i] = botList[i].c.setConnection();&nbsp; &nbsp; }&nbsp; &nbsp; await Task.WhenAll(tasks);&nbsp; &nbsp; Form1.Log("All done");}如果它是setConnection()返回项目的方法,则结果await Task.WhenAll(tasks)将包含项目的集合。
随时随地看视频慕课网APP
我要回答