第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

C#
不負(fù)相思意 2023-09-16 16:16:05
在 WPF 應(yīng)用程序中,我將消息輸出到文本框,并在這些消息之間調(diào)用一個設(shè)置儀器的函數(shù)。但是,這些消息都會同時出現(xiàn)(在函數(shù)調(diào)用結(jié)束時)。我真的不知道如何清楚地解釋我的問題。我會嘗試...我有一個 WPF 應(yīng)用程序,它使用串行端口從儀器獲取數(shù)據(jù)。該應(yīng)用程序包含一些按鈕和一個用于輸出消息的文本框。按下按鈕后,應(yīng)用程序會向儀器發(fā)送命令以更改某些參數(shù)(通過函數(shù)Set_COMM_MODE()),然后返回。更改大約需要 5-10 秒。因此,我所做的是:在呼叫之前輸出一條“請稍候”消息,在呼叫返回后輸出一條“完成”消息。OuputText()代碼中的函數(shù)只是調(diào)用方法TextBox.AppendText()。我的問題:呼叫返回時,所有輸出文本都會在文本框中顯示出來。我預(yù)計會出現(xiàn)“請稍候”...然后 5-10 秒后出現(xiàn)“完成”信息。但這一切都是同時出現(xiàn)的。但是,當(dāng)我在第一條消息之后(在函數(shù)調(diào)用之前)放置 aMessageBox時,該消息將出現(xiàn)在文本框輸出上(沒有被調(diào)用的函數(shù))。但問題是我必須按“確定”MessageBox才能繼續(xù)。Q(1):如何讓后者發(fā)生而不需要求助于MessageBoxQ(2):MessageBox為了創(chuàng)建這種行為,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}我希望立即顯示“請稍候” ,然后在函數(shù)返回后 5-10 秒后顯示“完成”Set_COMM_MODE()消息。
查看完整描述

1 回答

?
當(dāng)年話下

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 為此類問題提供了哪些解決方案。

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

  1. 打印一條消息

  2. 開始初始化

  3. ???

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

  5. 開始運行

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

.NET 為此提供了很多工具,例如 APM(異步編程模型)。但實現(xiàn)異步處理的最簡潔、最強大的方法是 TAP - 基于任務(wù)的異步編程模式,更廣為人知的名稱是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");

}

您確實應(yīng)該更多地了解現(xiàn)代編程技術(shù),TAP 就是其中之一。


查看完整回答
反對 回復(fù) 2023-09-16
  • 1 回答
  • 0 關(guān)注
  • 184 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號