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

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

為什么每個應用程序運行 5 秒鐘沒有響應,并且停止按鈕無法單擊?

為什么每個應用程序運行 5 秒鐘沒有響應,并且停止按鈕無法單擊?

C#
元芳怎么了 2022-01-09 10:57:04
我想用開始和停止按鈕制作 Pinger,我從這個論壇獲得的這段代碼就像 stopLoop:private bool _stopLoop;private void button1_Click(object sender, EventArgs e){    _stopLoop = false;    for (int i = 0; i < 100000 && !_stopLoop; ++i)    {        using (Ping p = new Ping())        {            lbPing.Text = p.Send(tbUrl.Text).RoundtripTime.ToString() + "ms\n";            lbPing.Update();        }    }}protected override void WndProc(ref Message m){    switch (m.Msg)    {        case 0x84:            base.WndProc(ref m);            if ((int)m.Result == 0x1)                m.Result = (IntPtr)0x2;            return;    }    base.WndProc(ref m);}private void btStop_Click(object sender, EventArgs e){    _stopLoop = true;}
查看完整描述

3 回答

?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

只需使用asyncandawait模式來釋放 UI


private async void button1_Click(object sender, EventArgs e)

{

   _stopLoop = false;


   while( !_stopLoop)

   {  

      using (var p = new Ping())

      {

         var pingReply = await p.SendPingAsync(IPAddress.Parse("1.1.1.1"), 10000);

         lbPing.Text = $"{pingReply.RoundtripTime} ms";

         await Task.Delay(1000);

      }

   }

}

其他資源

SendPingAsync(IPAddress, Int32)

將帶有指定數據緩沖區的 Internet 控制消息協議 (ICMP) 回顯消息發送到具有指定 IPAddress 的計算機,并作為異步操作從該計算機接收相應的 ICMP 回顯應答消息。此重載允許您為操作指定超時值。

參數

  • 地址 IPAddress

標識作為 ICMP 回顯消息目標的計算機的 IP 地址。

  • 暫停 Int32

等待 ICMP 回顯回復消息的最大毫秒數(在發送回顯消息之后)。


查看完整回答
反對 回復 2022-01-09
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

我認為您的停止按鈕不起作用,因為您的:

loop= for (int i = 0; i < 100000 && !_stopLoop; ++i)

在這個循環_stopLoop變量中總是true因為你使用了!Operator。


查看完整回答
反對 回復 2022-01-09
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

因為負責處理窗口消息(您的按鈕單擊)的執行線程正忙于執行您編寫的代碼。您的代碼阻止(阻止)線程返回到保持 UI 響應交互的正常工作。這是我們在編寫 Windows 應用程序時必須考慮的常見問題,而不是阻塞(保持忙碌)開始執行按鈕單擊處理程序中的代碼的線程。簡單來說,您必須讓進入您的點擊處理程序的線程盡快再次退出。在您的情況下,您已將其發送到一個不會在 5 秒內返回到您的代碼的方法中,而您需要做的是使用它來開始單獨執行長時間運行的方法,然后讓它返回處理 UI 更新

我們通過異步運行工作代碼或使用一種為它創建[類似的]單獨線程的機制來做到這一點

使用異步:https : //docs.microsoft.com/en-us/windows/uwp/debug-test-perf/keep-the-ui-thread-responsive

使用 backgroundworker:如何使用 BackgroundWorker?

(我故意避免鏈接任何鼓勵您直接創建和管理自己的線程的東西。以上兩種機制更適合現代應用程序)

作為附帶信息,Windows 本質上是通過具有消息隊列(先進先出)的應用程序工作的。您所做的一切(移動鼠標、單擊、按鍵)都會發布到此隊列中,并且您的程序有一個線程處理事件并對其進行操作。如果您在執行代碼時讓該線程忙幾秒鐘,它就不會消耗消息。操作系統注意到隊列越來越長,并淡化窗口/在標題中放置“無響應”。一旦 ui 線程沒有你的代碼,它就會消耗消息,你的應用程序就會再次活躍起來。


查看完整回答
反對 回復 2022-01-09
  • 3 回答
  • 0 關注
  • 179 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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