2010-10-24 55 views
0

Possible Duplicate:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on獲取跨線程操作在C#無效

我的一些代碼,我初始化的對象(在這種情況下一種形式),然後空轉,直到它從某人接收到消息時的工作,或者一個其方法直接調用。

在我的表單中,我有一個列表框(lTester),顯示對此表單的所有調用。在運行時,我得到以下錯誤:

Cross-thread operation not valid: Control 'lTester' accessed from a thread other than the thread it was created on.

我沒有手動啓動任何線程,其實我從來沒有與他們合作,並真的不知道如何C#內部管理的UI組件。有什麼辦法可以解決這個問題嗎?

+0

如何在收到消息時更新您的列表框?你能顯示你的代碼嗎?檢查Control.InvokeRequired屬性(System.Windows.Forms)http://bit.ly/c8dws8 – 2010-10-24 21:45:29

+0

接收消息的含義是什麼?這是來自其他組件嗎? – 2010-10-24 21:48:15

+0

劃傷消息部分。我通過lTester.Items.Add(「」)更新我的列表框。命令。換句話說,我有一個稱爲更新的方法,並在其中運行上述命令。所以從另一個班級,我會打電話給tester.update(x) – user472875 2010-10-24 21:57:18

回答

1

如果您想知道您的線程來自哪裏,可以在您調用的方法中放置一個斷點(在生成錯誤的位置),打開線程和VS中的堆棧跟蹤窗口,並查看發起呼叫的內容。

儘管代碼位於您的Form類中,但調用者仍然會決定執行調用的線程。因此,正如Oskar所說,您必須檢查是否需要Invoke才能進入主線程。有很多關於如何做到這一點的例子,只是谷歌InvokeRequired並從那裏去。

讓我知道你是否需要一個例子。

+0

好吧,我想這會做這件事情。令我困擾的是,我不明白這些多線程來自哪裏,即:所有這些都是在內部完成的。 – user472875 2010-10-24 22:01:24

+1

因爲你沒有發佈任何代碼,我們也沒有。你說「接收某人的消息」,這到底意味着什麼?接收如何?從誰或什麼? – 2010-10-24 22:22:08

+0

這是一個錯誤,我的測試者類實際上有事件可以引發,並且被其他類捕獲並處理。至於接收消息,我通過lTester.Items.Add(「」)更新我的列表框。命令。換句話說,我有一個稱爲更新的方法,並在其中運行上述命令。所以從另一個班級我會打電話給tester.update(x) – user472875 2010-10-24 22:25:51

2

在您觸摸ITester之前,您必須檢查InvokeRequired的值。如果它是真的,請調用函數Invoke