2012-07-20 70 views
0

我試圖從GUI中讀取值,並使用Task傳遞了如下所示的數據。我不明白的是由於只有組合框字段(即tab3_ddl_Range.SelectedText)而導致錯誤,如果我刪除它,錯誤消失。它不應該仍然給錯誤?當我從非GUI線程訪問GUI時?「跨線程操作無效」的行爲

factoryA.StartNew(() => ReadInstrument_3(
    Globls.numReadings, tab3_txt_Address.Text.TrimEnd(), tab3_rb_DCI.Checked, 
    tab2_rb_DCV.Checked, tab3_ddl_Range.SelectedText.TrimEnd(), 
    tab3_rb_FixedZ_10G.Checked, tab3_rb_FixedZ_10M.Checked, 
    tab3_rb_Azero_Off.Checked, tab3_rb_Azero_On.Checked, 
    tab3_rb_Azero_Once.Checked, tab3_txt_Aper.Text.TrimEnd(), 
    tab3_txt_Device_Timeout.Text.TrimEnd(), tab3_txt_SICL.Text.TrimEnd()) 
+0

假設這是WinForms,你可以修改標籤和/或標題來說明嗎?對於WPF,我通常會說使用數據綁定來處理這個 – 2012-07-20 14:57:05

回答

3

控件的某些屬性被緩存,不需要通過winapi調用來檢索它們的值。特別是Text屬性存儲在一個內部字符串中。因此,讀取線程中的Text屬性不會引發異常,因爲它只返回字符串值。然而,寫作卻需要更新字符串,以進行winapi調用來更新本機窗口。

這是觸發異常的winapi調用。特別是,訪問Handle屬性。

+0

hmm.So我想那麼它是無效的從另一個線程讀取組合框,因爲我嘗試了文本屬性,這仍然會引發錯誤。在沒有首先將值存儲在字符串中的情況下,我可以通過什麼方式讀取「tab3_ddl_range.SelectedText」? – user1514077 2012-07-20 13:25:11

+0

除了InvokeRequired之外,使用線程中控件的* any屬性是無效的。明確的方法是停止違反規則。 – 2012-07-20 13:28:14

+0

@Hans - 更多的好奇心,但是碰巧知道'可以從任何線程讀取'這種行爲是否延伸到WinForms(假設這是在這裏討論的UI框架)? – 2012-07-20 14:59:34