3 回答
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 回顯回復消息的最大毫秒數(在發送回顯消息之后)。
TA貢獻1805條經驗 獲得超9個贊
我認為您的停止按鈕不起作用,因為您的:
loop= for (int i = 0; i < 100000 && !_stopLoop; ++i)
在這個循環_stopLoop變量中總是true因為你使用了!Operator。
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 線程沒有你的代碼,它就會消耗消息,你的應用程序就會再次活躍起來。
- 3 回答
- 0 關注
- 179 瀏覽
添加回答
舉報
