[英]Forcing code execution on main thread
如何強制在我的主線程上執行一段代碼?
這就是為什么我想知道:
我有一個自定義創建的消息框,有時從一個不是主線程的線程顯示。 但是,當調用消息框構造函數時,我得到一個InvalidOperationException,說“調用線程必須是STA,因為許多UI組件都需要這個。” 這是有道理的,需要在主線程上處理UI元素。
我的MessageBox.ShowMessage(...)函數是一個靜態函數,它創建我的自定義消息框的實例並顯示它。 是否有一些東西可以放在ShowMessage中,它會強制創建消息框並顯示在主線程上? 在我的代碼的其他地方,我使用Control.BeginInvoke來處理類似的問題,但由於它是一個靜態函數,因此我沒有現有的UI元素來調用BeginInvoke。
我是否必須使用Control.BeginInvoke調用MessageBox.ShowMessage? 我更喜歡從ShowMessage中調用BeginInvoke(或一些等價物)。
這里有幾個選項:
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.