我一直在尝试解决这个问题,但我似乎无法绕过它。我有以下异步任务,它从名为“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个完成的同时存储结果?
谢谢。
这是一个可能的实现,假设您想要依次对所有机器人进行StartClient
,然后调用setConnection
和await
来完成它们。
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()
应该返回一个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
当您等待任务时,您将获得结果,因此:
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");
}
的结果将包含一组项目。