2008-12-03 150 views
0

該代碼通過多種方式執行。當它由表單按鈕執行時,它就起作用(按鈕啓動一個線程,並在循環中調用此方法=它工作)。但是當我在窗體中從我的BackgroundWorker調用該方法時,它不起作用。幫我解決這個CrossThread問題?

用下面的代碼:

private void resizeThreadSafe(int width, int height) 
{ 
    if (this.form.InvokeRequired) 
    { 
     this.form.Invoke(new DelegateSize(resizeThreadSafe), 
      new object[] { width, height }); 
    } 
    this.form.Size = new Size(width, height); // problem occurs on this line 
    this.form.Location = new Point(0, 0); // dummy coordinate 
} 

然後在含有this.form.Size = ...我得到下面的異常行:

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

爲什麼?

回答

6

您需要在if塊的末尾返回 - 否則您將在正確的線程中調整它的大小,然後在錯誤的線程中執行它。

換句話說(如果你想剪切和粘貼代碼,而不是照片,這本來就容易......)

private void resizeThreadSafe(int width, int height) 
{ 
    if (this.form.InvokeRequired) 
    { 
     this.form.Invoke(new DelegateSize(resizeThreadSafe, 
      new object[] { width, height }); 
     return; 
    } 
    this.form.Size = new Size(width, height); 
    this.form.Location = new Point(0, SystemInformation.MonitorSize // whatever comes next 
} 

或者只是把方法的下半年的「其他「塊。

1

你需要這樣寫:根據你的編碼風格

if (this.form.InvokeRequired) { 
    this.form.Invoke(......); 
    return; 
} 
this.form.Size = new Sizte(...); 

OR

if (this.form.InvokeRequired) { 
    this.form.Invoke(......); 
} 
else { 
    this.form.Size = new Sizte(...); 
} 
1

要麼使用Invoke之後回報或把實際行動爲封鎖其他

相關問題