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

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

messageBox.Show() 執行什么操作才能停止 UI 線程的執行?

messageBox.Show() 執行什么操作才能停止 UI 線程的執行?

C#
不負相思意 2023-09-16 16:16:05
在 WPF 應用程序中,我將消息輸出到文本框,并在這些消息之間調用一個設置儀器的函數。但是,這些消息都會同時出現(在函數調用結束時)。我真的不知道如何清楚地解釋我的問題。我會嘗試...我有一個 WPF 應用程序,它使用串行端口從儀器獲取數據。該應用程序包含一些按鈕和一個用于輸出消息的文本框。按下按鈕后,應用程序會向儀器發送命令以更改某些參數(通過函數Set_COMM_MODE()),然后返回。更改大約需要 5-10 秒。因此,我所做的是:在呼叫之前輸出一條“請稍候”消息,在呼叫返回后輸出一條“完成”消息。OuputText()代碼中的函數只是調用方法TextBox.AppendText()。我的問題:呼叫返回時,所有輸出文本都會在文本框中顯示出來。我預計會出現“請稍候”...然后 5-10 秒后出現“完成”信息。但這一切都是同時出現的。但是,當我在第一條消息之后(在函數調用之前)放置 aMessageBox時,該消息將出現在文本框輸出上(沒有被調用的函數)。但問題是我必須按“確定”MessageBox才能繼續。Q(1):如何讓后者發生而不需要求助于MessageBoxQ(2):MessageBox為了創建這種行為,a 做了什么?我嘗試過:使用該Dispatch.Invoke()方法在另一個線程上運行OutputText。這個(Pause a window like MessageBox.Show())與我遇到的問題類似,但似乎沒有得到明確的答案,而且我也不太理解解決方案。void StartTest_btn_Click(object sender, RoutedEventArgs e){    OutputText("Please Wwait\r\n"); //<---- This should appear at once.    MessageBox.Show("Please Wwait"); //<--without this, both messages appear at same time after 10s.    Set_COMM_MODE("02"); //<--- This takes around 5-10s    OutputText("Done\r\n"); //<--- This should appear 5-10s later}我希望立即顯示“請稍候” ,然后在函數返回后 5-10 秒后顯示“完成”Set_COMM_MODE()消息。
查看完整描述

1 回答

?
當年話下

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

正如我在評論中所寫,您實際上應該僅將(主)UI 線程用于 UI。在工作線程上執行任何其他長時間運行的非 UI 操作。

您可能不介意 UI“掛起”10 秒,但用戶肯定會感到惱火。此外,阻止 UI 線程將導致 Windows 認為您的應用程序已凍結,因此您將獲得漂亮的“無響應”徽章和所有相關內容。這不僅看起來很糟糕,而且還會導致各種副作用。

您確實應該環顧四周,看看 .NET 為此類問題提供了哪些解決方案。

看,這就是你的工作流程:

  1. 打印一條消息

  2. 開始初始化

  3. ???

  4. 初始化完成-->打印“done”

  5. 開始運行

這是什么?這是一個異步處理。您啟動一個操作并異步繼續 - 這意味著僅當該操作完成時。

.NET 為此提供了很多工具,例如 APM(異步編程模型)。但實現異步處理的最簡潔、最強大的方法是 TAP - 基于任務的異步編程模式,更廣為人知的名稱是asyncawait。

看,您的問題可以使用 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");

}

您確實應該更多地了解現代編程技術,TAP 就是其中之一。


查看完整回答
反對 回復 2023-09-16
  • 1 回答
  • 0 關注
  • 169 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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