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
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)将包含项目的集合。
- 2 回答
- 0 关注
- 447 浏览
添加回答
举报