2010-07-09 51 views
2

我有兩臺機器,一個是老的東芝筆記本電腦,我在家裏使用的發展,另一個是一個1歲的戴爾在工作。兩者都運行相同版本的Visual Studio 2008.在過去的幾個月中,我一直在爲客戶構建一個項目。它在我的舊筆記本電腦上運行良好,但是如果我在工作環境中運行它,我會遇到跨線程問題,有人知道爲什麼?有什麼項目/環境,我需要選擇或取消...同一項目,不同的機器,一臺機器具有跨線程問題

,因爲我添加了一個選項卡控制主用戶界面的問題已經發生過。我已像的可膨脹面板反應,從而用戶可以將其隱藏如果不使用它 - 加載的主要形式時,當突片控制被動態地調整大小發生錯扣錯誤。

這是該行失敗的,這是主要的負載部分:

expandable_tabcontrol.Left += expandable_tabcontrol.Width; 

這是錯誤消息:在家

An unhandled exception of type 'System.InvalidOperationException' 
occurred in System.Windows.Forms.dll 

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

運行正常,無法在工作..

謝謝,R.

+0

多線程錯誤是永遠存在的。只是有時他們碰巧工作,有時不工作。 在這種情況下,確定的第一件事情是怎麼這段代碼被另一個線程上運行?你有'BackgroundWorker'嗎? – 2010-07-09 20:12:45

+0

問題:*您是否從不同的線程訪問該控件? – 2010-07-09 20:14:47

+0

這裏沒有很多信息。我會做的第一件事:全局搜索整個System.Threading命名空間的解決方案。接下來,我會查看是否有第三方控件修改內容。 – Juliet 2010-07-09 20:20:53

回答

3

很難確定沒有一點信息,但對我來說,聽起來像調整大小的方法可以在多個地方調用。您的舊東芝很可能是一臺單核機器,因此計算機不能一次完成多件事情,並且該選項卡由主線程調整大小。在您的較新的戴爾機器上,可能有多個核心,一個輔助線程正在調用調整大小的方法,這會引發異常。

研究使用Control.InvokeRequiredControl.Invoke來處理後臺線程和UI線程之間的同步。

+0

我同意第一段。但是,不要使用'Invoke',並且肯定不要使用'InvokeRequired'。使用「任務」或「BackgroundWorker」。 – 2010-07-09 20:26:18

+0

如果您想從工作線程以外的線程更新UI,您肯定需要使用Invoke或類似的東西。例如,一個系統定時器事件處理程序將不得不使用它。 BackgroundWorker是否具有用於更新UI的Invoke等效項? – 2010-07-09 20:51:43

+0

好吧,這是總的感覺,我添加了一個委託給定時器方法,用於擴展和縮小面板。在加載時,我還鎖定了表單創建方法和初始面板調整,現在所有錯誤都消失了。這些評論非常有用,謝謝。 – flavour404 2010-07-09 20:52:36

相關問題