2013-03-12 75 views
2

我的話題幾乎是個問題。我知道有一個線程訪問GUI控件的限制。似乎是從另一個主線程不可能的線程寫入/設置控件。線程訪問GUI控件

但是,例如,當我嘗試讀取複選框是否被選中時,它就起作用。閱讀組合框的文本不會。

我使用Windows窗體和.NET框架4

有人能告訴我哪裏有侷限性線程?

+0

什麼UI框架,你要求? – thumbmunkeys 2013-03-12 15:25:57

+2

即時例外是調試功能。讀取複選框不一定安全。限制是:_entire_ GUI不是線程安全的。 – 2013-03-12 15:27:59

+1

@Servy這不是一個瀆職重複,因爲他要求改變ui。我說我知道changig是不好的,但我不確定要閱讀 – derape 2013-03-12 15:39:15

回答

0

UI元素只能在UI線程上進行更新 - 您可以檢查是否invoke required讓你知道,如果你在另一個線程。

這裏有一個類似的問題,你可能會喜歡When is invoke required on GUI objects?

+0

謝謝,我正在問一個更一般的答案。所以我猜想沒有。即使我沒有明確地嘗試寫UI,即使閱讀通常不是一個好主意,即使它有效! – derape 2013-03-12 15:32:54

+0

我不會依賴它的工作,沒有 – NDJ 2013-03-12 15:34:50

+0

你也可能喜歡這個鏈接 - 答案說'有可能(讀取值),但可能導致意外的行爲 - http://stackoverflow.com/questions/13975938/ is-it-it-it-access-a-ui-element-from-another-thread-if-the-thread-doesnt – NDJ 2013-03-12 15:37:17

1

無論何時訪問UI元素,您都必須在UI線程上。您觀察到的內容不取決於控件是複選框還是下拉菜單,而取決於您正在訪問的線程。

Windows窗體控件提供Invoke方法調用對UI線程的調用。還有一個異步BeginInvoke。異步調用可能會加速您的系統(取決於您的設計)。

有一個在WPF的調度的文章:Build More Responsive Apps With The Dispatcher

1

您可以調用一個動作做UI的東西,但是當你需要從你的工作線程訪問它的東西時,才需要。

void UpdateMessage (string message) 
{ 
    Action action =() => txtMessage.Text = message; 
    this.Invoke (action); 
} 

This is a really good resource about threading