1 回答

TA貢獻(xiàn)1890條經(jīng)驗 獲得超9個贊
正如我在評論中所寫,您實際上應(yīng)該僅將(主)UI 線程用于 UI。在工作線程上執(zhí)行任何其他長時間運行的非 UI 操作。
您可能不介意 UI“掛起”10 秒,但用戶肯定會感到惱火。此外,阻止 UI 線程將導(dǎo)致 Windows 認(rèn)為您的應(yīng)用程序已凍結(jié),因此您將獲得漂亮的“無響應(yīng)”徽章和所有相關(guān)內(nèi)容。這不僅看起來很糟糕,而且還會導(dǎo)致各種副作用。
您確實應(yīng)該環(huán)顧四周,看看 .NET 為此類問題提供了哪些解決方案。
看,這就是你的工作流程:
打印一條消息
開始初始化
???
初始化完成-->打印“done”
開始運行
這是什么?這是一個異步處理。您啟動一個操作并異步繼續(xù) - 這意味著僅當(dāng)該操作完成時。
.NET 為此提供了很多工具,例如 APM(異步編程模型)。但實現(xiàn)異步處理的最簡潔、最強大的方法是 TAP - 基于任務(wù)的異步編程模式,更廣為人知的名稱是async
/ await
。
看,您的問題可以使用 TAP 通過幾行代碼來解決:
async void StartTest_btn_Click(object sender, RoutedEventArgs e)
{
OutputText("Please Wait\r\n");
// Set_COMM_MODE will be executed on a worker thread!
// The main (UI) thread won't block. It will continue.
// But the StartTest_btn_Click method itself will pause until the task is finished.
await Task.Run(() => Set_COMM_MODE("02"));
// This line will only be executed, after the Set_COMM_MODE call is completed;
// furthermore, it will be executed on the UI thread again!
OutputText("Done\r\n");
}
您確實應(yīng)該更多地了解現(xiàn)代編程技術(shù),TAP 就是其中之一。
- 1 回答
- 0 關(guān)注
- 184 瀏覽
添加回答
舉報