13
A
回答
3
如果數據修改不是太耗時(即,如果後臺線程的主要目的不是實際的數據修改),請嘗試將修改數據的部分移動到委託並調用該委託。
如果實際繁重的工作在數據上,您可能需要創建此數據的深層副本以傳遞給後臺線程,後臺線程將再次通過Invoke將處理後的數據發送回UI線程。
您將只需要移動將數據更改爲委託函數的代碼(因爲數據更改是觸發控件更新的原因)。除此之外,你不應該寫任何額外的東西。
3
你應該能夠做這樣的事情:
if (control.InvokeRequired)
{
control.Invoke(delegateWithMyCode);
}
else
{
delegateWithMyCode();
}
InvokeRequired是控制屬性,看看你是否在正確的線程,然後調用將調用在正確的線程的委託。
UPDATE:其實,在我上一份工作,我們做了這樣的事情:
private void SomeEventHandler(Object someParam)
{
if (this.InvokeRequired)
{
this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
}
// Regular handling code
}
這消除了對其他模塊的需要,那種收緊的代碼。
1
因爲我沒有測試用例,所以我不能保證這個解決方案,但在我看來,類似於用於更新不同線程中的進度條的場景(使用委託)將會適合在這裏。
public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);
public void DoDataBind()
{
DataBind();
}
如果數據綁定需要由特定線程完成,那麼讓該線程完成工作!
0
如果線程調用是「非法」的(即DataBind調用會影響在線程中沒有創建的控件,那麼它將被調用),那麼您需要創建一個委託,以便即使DataBind的決策/準備不是在控制創建線程中完成的,它們的任何結果修改(即DataBind())將會是。
你會調用從輔助線程我的代碼如下所示:
this.BindData.Invoke();
這將進而導致原來的線程做綁定,這(假定它是創建控件的線程)應該工作。
0
在WPF和Silverlight中,綁定基礎結構負責切換到UI線程。
相關問題
- 1. 非法跨線程操作異常,無法處理它
- 2. 如何解決跨線程操作
- 3. 跨線程操作異常的規則?
- 4. 非法跨線程操作錯誤
- 5. 跨線程操作無效AMD試圖找到一個解決方案
- 6. 如何解決C#中的跨線程異常?
- 7. 多線程解決方案
- 8. IE11:渲染表中性能非常差 - 任何解決方案?
- 9. 異常在線程「主」java.util.NoSuchElementException無法找到我的情況的解決方案
- 10. Java堆空間異常,大量數據,任何解決方案?
- 11. WPF解決方案非常奇怪
- 12. Fitnesse + WebDriver:任何工作解決方案?
- 13. 解決方案沒有任何動作
- 14. 異常跟蹤解決方案
- 15. 操作系統:Peterson的解決方案
- 16. 跨線程異常
- 17. 如何解決「跨線程操作無效」問題?
- 18. 如何解決「跨線程操作無效」?
- 19. 程序無法正常工作的解決方案
- 20. 寫生解決方案曲線方程
- 21. Python線程錯誤,任何人都有解決方案?
- 22. 如何在非線程方法解決此問題「線程中的異常」主要「java.util.ConcurrentModificationException」
- 23. 如何解決此異常:線程「main」中的異常java.lang.ClassCastException
- 24. 路徑操作解決方案?
- 25. Python的線程通信解決方案
- 26. 不一致的「跨線程操作無效」異常
- 27. 內部控件的「跨線程操作無效」異常
- 28. 針對Firebase異常的任何解決方法NoClassDefFoundError:LLRBNode $ NodeVisitor
- 29. 跨線程操作
- 30. 跨線程操作