为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
米琪卡哇伊 2022-01-16 15:14:18
我现在一直试图弄清楚这一点,但我似乎无法理解它。我有以下异步任务,它从名为“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 个完成的同时,我将如何存储结果?谢谢。
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

这是一种可能的实现,假设您想按顺序在所有机器人上,StartClient然后调用它们来完成。setConnectionawait


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

{

    this.botList = botList;

    var tasks = new List<Task>();

    foreach(var botKvp in botList)

    {

        var bot = botKvp.Value;

        bot.proc = await bot.c.StartClient();

        tasks.Add(bot.c.setConnection());

    }

    await Task.WhenAll(tasks);

    Form1.Log("All done");            

}

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


查看完整回答
反对 回复 2022-01-16
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

当您等待任务时,您会得到结果,因此:


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

        botList[i].proc = await tasks[i];


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

    }

    await Task.WhenAll(tasks);

    Form1.Log("All done");

}

如果它是setConnection()返回项目的方法,则结果await Task.WhenAll(tasks)将包含项目的集合。


查看完整回答
反对 回复 2022-01-16
  • 2 回答
  • 0 关注
  • 447 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信