簡體   English   中英

強制在主線程上執行代碼

[英]Forcing code execution on main thread

如何強制在我的主線程上執行一段代碼?

這就是為什么我想知道:

我有一個自定義創建的消息框,有時從一個不是主線程的線程顯示。 但是,當調用消息框構造函數時,我得到一個InvalidOperationException,說“調用線程必須是STA,因為許多UI組件都需要這個。” 這是有道理的,需要在主線程上處理UI元素。

我的MessageBox.ShowMessage(...)函數是一個靜態函數,它創建我的自定義消息框的實例並顯示它。 是否有一些東西可以放在ShowMessage中,它會強制創建消息框並顯示在主線程上? 在我的代碼的其他地方,我使用Control.BeginInvoke來處理類似的問題,但由於它是一個靜態函數,因此我沒有現有的UI元素來調用BeginInvoke。

我是否必須使用Control.BeginInvoke調用MessageBox.ShowMessage? 我更喜歡從ShowMessage中調用BeginInvoke(或一些等價物)。

這里有幾個選項:

  • 制作第二個線程STA(您只能為自己的Thread執行此操作 - 不適用於ThreadPool線程) - 通過.SetApartmentState(ApartmentState.STA);
  • 看看SynchronizationContext.Current是否為非null; 如果是這樣,請使用Send / Post
  • 將表單/控件作為ISynchronizeInvoke實例傳遞(可能不適用於WPF - 我不是100%肯定)

你的想法是正確的 - 為了讓它正常工作,你需要從主線程中調用它。

最簡單的方法? 當您啟動主窗體時,將引用保存在ShowMessage()調用可見的靜態變量中。 然后,您的ShowMessage可以執行標准:

if(myForm.InvokeRequired)
{
     myForm.Invoke(() => ShowMessage(arg1,arg2,arg3));
     return;
}
.... other code here....

而不是直接顯示消息框,只需向主線程發送一條消息,該消息指示主線程顯示一個消息框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM