2011-04-05 57 views
3

使用C#Windows.Forms,必須在主/ GUI線程(需要Invoke/BeginInvoke)上運行Invalidate(),Refresh()等方法嗎?如何更改GUI對象的成員,如添加/刪除點或更改Charting.Chart對象中的系列的顏色?何時在GUI對象上調用時需要?

我有一些工作線程中發生的這些變化沒有任何問題(所以我猜他們沒事嗎?),但我試圖區分GUI線程需要哪些更改以及哪些更改可以發生工作線程中的對象。有沒有人有鏈接或書籍參考指導這個問題?

+0

任何使用窗口句柄 – 2011-04-05 16:16:53

+2

如果沒有他們明確地告訴你一個異常,類可能是線程不安全的。 List <>類將是一個例子。只有當文檔告訴你該成員是線程安全的時,才使用其實例創建的類的成員或在另一個線程上訪問的成員。這很少見,Chart類肯定不是。這不是你「冒險」的東西,猜錯的代價是巨大的。 – 2011-04-05 16:54:47

回答

4

在一般情況下,你通常應該承擔的所有改變GUI元素應該在UI線程上進行。

通常,後臺線程上的更改在測試過程中將起作用,但會中斷部署後。一般來說,除非另有說明,假設所有內容都應該在UI線程上更安全。

-1

這應該告訴你Control.InvokeRequired

+0

這只是告訴你,你是否目前在UI線程,而不是一個特定的API是否需要這個。 – 2011-04-05 16:18:08

+0

這只是告訴你,如果你在錯誤的線程。它不會告訴你你要調用的方法是否需要在窗口句柄的線程上運行。 – 2011-04-05 16:18:56

+0

@Reed Copsey:只有當它創建了句柄 – 2011-04-05 16:21:15

1

您不能在工作線程上進行操作WinForms控件的同步方法調用。

我不確定什麼「添加/刪除點」指的是Charting.Chart類。這個類可以自己封裝GUI線程調用。一般來說,如果您要修改控件上的大小,文本,背景顏色或其他屬性,則必須使用Invoke/BeginInvoke。

相關問題