亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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. 作為反例,這將失?。?/p>


Task procTask = bot.c.StartClient();

bot.proc = await procTask


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

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)將包含項目的集合。


查看完整回答
反對 回復 2022-01-16
  • 2 回答
  • 0 關注
  • 499 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號