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. 作為反例,這將失?。?/p>
Task procTask = bot.c.StartClient();
bot.proc = await procTask

TA貢獻1821條經驗 獲得超5個贊
當您等待任務時,您會得到結果,因此:
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 關注
- 499 瀏覽
添加回答
舉報