2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
因?yàn)槟阌幸粋€(gè)異步方法,所以當(dāng)它被調(diào)用時(shí)它會(huì)返回任務(wù),如下所示:
Task<string> task = server.CustomPing(server.IP, amountOfPackets, sizeOfPackets);
當(dāng)您將其直接添加到您的ListBox同時(shí)將其與字符串連接時(shí),它將使用該ToString方法,該方法默認(rèn)打印對(duì)象的完整類名。這應(yīng)該解釋你的輸出:
System.Threading.Tasks.Taks`1[System.string]
該[System.string]部分實(shí)際上告訴您任務(wù)結(jié)果的返回類型。這就是你想要的,要得到它,你需要等待!像這樣:
foreach (var server in ServerList)
ListBox.Items.Add("The average response time of your custom server is: " + await server.CustomPing(server.IP, amountOfPackets, sizeOfPackets));
1)這必須用另一種async方法來(lái)完成并且
2)這會(huì)擾亂你想要的所有并行性。因?yàn)樗鼤?huì)等待每個(gè)方法調(diào)用完成。
你能做的就是依次啟動(dòng)所有任務(wù),收集返回的任務(wù)并等待所有任務(wù)完成。最好您可以在異步方法(如點(diǎn)擊處理程序)中執(zhí)行此操作:
private async void Button1_Click(object sender, EventArgs e)
{
Task<string> [] allTasks = ServerList.Select(server => server.CustomPing(server.IP, amountOfPackets, sizeOfPackets)).ToArray();
// WhenAll will wait for all tasks to finish and return the return values of each method call
string [] results = await Task.WhenAll(allTasks);
// now you can execute your loop and display the results:
foreach (var result in results)
{
ListBox.Items.Add(result);
}
}

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
該類System.Threading.Tasks.Task<TResult>
是多任務(wù)處理的輔助類。雖然它駐留在線程命名空間中,但它也適用于無(wú)線程多任務(wù)處理。事實(shí)上,如果您看到一個(gè)函數(shù)返回一個(gè)任務(wù),您通??梢詫⑺糜谌魏涡问降亩嗳蝿?wù)處理。任務(wù)的使用方式非常不可知。如果您不介意任務(wù)執(zhí)行次數(shù)不多而帶來(lái)的額外開銷,您甚至可以同步運(yùn)行它。
任務(wù)有助于實(shí)現(xiàn)多任務(wù)處理的一些最重要的規(guī)則/慣例:
不要意外吞下異常。眾所周知,線程基多任務(wù)處理在這方面做得很好。
取消后請(qǐng)勿使用結(jié)果
如果您嘗試訪問(wèn)結(jié)果屬性,而約定告訴我們不應(yīng)該這樣做,那么它會(huì)向您拋出異常(通常是聚合異常)來(lái)實(shí)現(xiàn)這一點(diǎn)。
以及具有多任務(wù)處理的所有其他有用屬性。
- 2 回答
- 0 關(guān)注
- 201 瀏覽
添加回答
舉報(bào)