簡體   English   中英

C#-BackgroundWorker不斷更新控件:錯誤!

[英]C# - BackgroundWorker Constantly Updating Control: Error!

傳統上,由於某些原因,我在C#中使用BackgroundWorkers遇到很多麻煩; 他們的概念確實讓我感到難過,所以我希望這是一個相當基本的問題,並且可以很容易地糾正這些問題。

我有兩種使用.NET遠程通訊來進行通訊的形式。 現在,更改Form1上的設置會導致Form2上發生某些更改,並且效果很好。 但是,現在我需要以另一種方式使同一事物工作(在Form2上進行更改會導致Form1進行更新),而我不能以相同的方式進行操作(由於設計方面的限制,我無法讓Form2發送更改)到Form1)。 現在,我試圖在Form1上使用BackgroundWorker不斷在每個子控件(放置在Form1上)上調用“ Update()”方法。 這些控件中的每一個都具有從Form2抓取​​其等效設置的當前狀態並進行自我更新的方式(此方法很好;已經看到'Update()'方法正在Form1的初始化上起作用)。

這是我的問題所在。 我不確定如何使BackgroundWorker在每個表單上不斷調用“ Update()”,因此在我的“ DoWork()”方法中,我有一個“ while(true)”循環,並且在其中,BackgroundWorker調用了“ Update” ()'每個子控件的方法,然后睡眠很短的時間,然后重復。

這樣,我收到一個“ InvalidOperationException未由用戶代碼處理”錯誤,並詳細說明“跨線程操作無效:從創建該線程的線程以外的其他線程訪問控件'comboBox_BGColor'。” 現在,我基本上了解了這意味着什么,並且知道了為什么會發生這種情況,但是,我不確定該做什么或如何更改這些東西以使其按預期工作。 有人對這個或我使用BackgroundWorker的方式有任何提示嗎? 非常感謝您提供任何信息,並抽出寶貴的時間閱讀本文!

UI控件具有線程關聯性 除了UI線程外,您不應觸摸任何線程的控件(用於讀取寫入)。 如果BackgroundWorker 主要是在與UI進行對話,則最好使用Timer控件更好,而不必多次調用InvokeBeginInvoke

但是, 通常,我更喜歡這里的基於“觀察者”的設計,其中包含更改通知事件( FooChangedINotifyPropertyChanged )和事件處理程序,這些事件處理程序會導致UI反映更改。

您需要計時器控制而不是后台工作人員

您收到的異常是直接從BackgroundWorker線程中的_DoWork調用Update() (正在修改主線程中的一個或多個表單)的結果。

如果要使用BackgroundWorker方法:

  • 將工作人員的.WorkerReportsProgress屬性設置為true
  • 執行循環時,請使用工作程序的.ReportProgress()方法來觸發工作程序的_ProgressChanged事件處理程序。
  • 然后, _ProgressChanged事件處理程序可以安全地調用表單的Update()方法。

如果您不使用該工作程序(特別是如果您的后台工作程序僅用於此循環),那么我建議您接受Marc關於標准事件處理程序的建議 與添加外部循環或Timer控件相比,該路由將產生更少的處理器開銷(但是,當前可能有或沒有)。

任一路由都應解決跨線程異常。

暫無
暫無

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

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