簡體   English   中英

為什么用戶控件類訪問不能從另一個線程安全?

[英]why isn't user-control class access not safe from another thread?

正如標題所說,為什么用戶控件類訪問不能從另一個線程安全? 我聽說有一種方法可以啟用跨線程訪問,並且我正在考慮這樣做。任何想法為什么我不應該這樣做?

看看這個:

http://msdn.microsoft.com/en-us/library/ms171728.aspx

對Windows窗體控件的訪問本質上不是線程安全的。 如果有兩個或多個線程操縱控件的狀態,則可以強制控件進入不一致狀態。 其他與線程相關的錯誤也是可能的,例如競爭條件和死鎖。 確保以線程安全的方式訪問控件非常重要。

UserControl實例與“UI線程”具有線程關聯,當您嘗試從潛在的工作線程移動到UI線程時,它將需要來回編組。

此外,線程安全組件完全不同,因為例如,如果跨多個線程共享單個UserControl實例,則需要同步所有成員變量,因此也可能被訪問。

這可以嗎? 理論上是的......應該這樣做嗎? 不必要。 我會重新審視您的設計並質疑您在UserControl中需要此行為的原因。 關注點的分離應該浮出水面,也許你可以從UserControl中獲得耗時的任務,從而減輕你的負擔。

允許從另一個線程(即,未創建的線程)訪問WinForms控件可能導致死鎖和競爭條件。 兩個同時運行的線程,都試圖更新相同的控件,可能最終等待彼此完成,然后才能執行任何操作。 (請參閱MSDN 。)WinForms保護您免受這些隱藏的錯誤。

如果需要,您可以使用BeginInvoke方法輕松地指示您希望它控制的線程更新控件並向其傳遞委托:

myUserControl.BeginInvoke(myUserControl.PaintItBlack);

這將在創建控件的線程上異步執行指定的委托,從而確保安全訪問。

暫無
暫無

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

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