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

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

我的代碼有什么問題(SendPingAsync)

我的代碼有什么問題(SendPingAsync)

C#
忽然笑 2023-07-22 15:45:52
我正在編寫一個C#Ping 應用程序。我一開始使用synchronousPing 方法,但我發現一鍵 ping 多個服務器需要越來越多的時間。所以我決定嘗試一下這個asynchronous方法。有人可以幫我嗎?public async Task<string> CustomPing(string ip, int amountOfPackets, int sizeOfPackets){    // timeout    int Timeout = 2000;    // PaketSize logic    string packet = "";    for (int j = 0; j < sizeOfPackets; j++)    {        packet += "b";    };    byte[] buffer = Encoding.ASCII.GetBytes(packet);    // time-var    long ms = 0;    // Main Method    using (Ping ping = new Ping())        for (int i = 0; i < amountOfPackets; i++)        {            PingReply reply = await ping.SendPingAsync(ip, Timeout, buffer);            ms += reply.RoundtripTime;        };    return (ms / amountOfPackets + " ms");};我定義了一個“服務器”類(IP 或主機、城市、國家/地區)。然后我創建一個“服務器”列表:List<Server> ServerList = new List<Server>()            {                new Server("www.google.de", "Some City,", "Some Country")};然后我循環遍歷這個列表,并嘗試調用如下方法:foreach (var server in ServerList)ListBox.Items.Add("The average response time of your custom server is: " + server.CustomPing(server.IP, amountOfPackets, sizeOfPackets));不幸的是,這比方法更具競爭力synchronous,并且在我的方法應該返回值的地方,它返回System.Threading.Tasks.Taks`1[System.string]
查看完整描述

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);

    }


}


查看完整回答
反對 回復 2023-07-22
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

該類System.Threading.Tasks.Task<TResult>是多任務處理的輔助類。雖然它駐留在線程命名空間中,但它也適用于無線程多任務處理。事實上,如果您看到一個函數返回一個任務,您通??梢詫⑺糜谌魏涡问降亩嗳蝿仗幚?。任務的使用方式非常不可知。如果您不介意任務執行次數不多而帶來的額外開銷,您甚至可以同步運行它。

任務有助于實現多任務處理的一些最重要的規則/慣例:

  • 不要意外吞下異常。眾所周知,線程基多任務處理在這方面做得很好。

  • 取消后請勿使用結果

如果您嘗試訪問結果屬性,而約定告訴我們不應該這樣做,那么它會向您拋出異常(通常是聚合異常)來實現這一點。

以及具有多任務處理的所有其他有用屬性。


查看完整回答
反對 回復 2023-07-22
  • 2 回答
  • 0 關注
  • 220 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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