2 回答

TA貢獻1829條經驗 獲得超7個贊
因為你有一個異步方法,所以當它被調用時它會返回任務,如下所示:
Task<string> task = server.CustomPing(server.IP, amountOfPackets, sizeOfPackets);
當您將其直接添加到您的ListBox同時將其與字符串連接時,它將使用該ToString方法,該方法默認打印對象的完整類名。這應該解釋你的輸出:
System.Threading.Tasks.Taks`1[System.string]
該[System.string]部分實際上告訴您任務結果的返回類型。這就是你想要的,要得到它,你需要等待!像這樣:
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方法來完成并且
2)這會擾亂你想要的所有并行性。因為它會等待每個方法調用完成。
你能做的就是依次啟動所有任務,收集返回的任務并等待所有任務完成。最好您可以在異步方法(如點擊處理程序)中執行此操作:
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貢獻1877條經驗 獲得超6個贊
該類System.Threading.Tasks.Task<TResult>
是多任務處理的輔助類。雖然它駐留在線程命名空間中,但它也適用于無線程多任務處理。事實上,如果您看到一個函數返回一個任務,您通??梢詫⑺糜谌魏涡问降亩嗳蝿仗幚?。任務的使用方式非常不可知。如果您不介意任務執行次數不多而帶來的額外開銷,您甚至可以同步運行它。
任務有助于實現多任務處理的一些最重要的規則/慣例:
不要意外吞下異常。眾所周知,線程基多任務處理在這方面做得很好。
取消后請勿使用結果
如果您嘗試訪問結果屬性,而約定告訴我們不應該這樣做,那么它會向您拋出異常(通常是聚合異常)來實現這一點。
以及具有多任務處理的所有其他有用屬性。
- 2 回答
- 0 關注
- 220 瀏覽
添加回答
舉報