C# - 如何同时处理任务并将值分配给变量

问题描述 投票:-1回答:2

我一直在尝试解决这个问题,但我似乎无法绕过它。我有以下异步任务,它从名为“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()函数返回一个Process,我希望将每个bot的类中的Process存储在一个名为“proc”的变量中。

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

谢谢。

c# asynchronous async-await task
2个回答
0
投票

这是一个可能的实现,假设您想要依次对所有机器人进行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有两种:TaskTask<T>。你有一个Task数组,它没有定义返回值。如果你想返回一个值,你需要await一个Task<T>。例如,如果setConnection()应该返回一个bool然后它的签名应该声明为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();

因为qazxsw poi返回qazxsw poi和StartClient()等待该任务并将过程分配给Task<Process>。作为反例,这将失败:

await

0
投票

当您等待任务时,您将获得结果,因此:

proc

如果是返回该项目的Task procTask = bot.c.StartClient(); bot.proc = await procTask 方法,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"); } 的结果将包含一组项目。

© www.soinside.com 2019 - 2024. All rights reserved.