2010-08-26 26 views
1

我有一個帶有菜單條,狀態條和主拆分容器(其本身包含其他拆分容器,樹視圖,選項卡控件等)的窗體。偶爾(相當頻繁,實際上),應用程序將停止在主窗體中調整控件的大小(通常在後臺線程操作期間或之後檢索數據)。該控件本身仍然聲稱它的DockStyle是Fill,但控件不會調整窗體大小。我找不到任何有關可能導致此問題的信息,有沒有人遇到類似這樣的事情?C#窗體 - 在線程操作期間控制丟失碼頭狀態

+0

您的後臺線程是否可以訪問您的任何UI控件?你正確使用Invoke嗎? – Bob 2010-08-26 20:24:37

+0

以前從未聽說過那個。我們需要repro代碼。 – 2010-08-26 20:34:24

+0

我正在測試UI控件上的InvokeRequired,所以這不應該是一個問題。我會嘗試做一個可重複的測試用例。 – genki 2010-08-26 21:05:07

回答

0

那麼,這是愚蠢的。

原來我有一個流氓SuspendLayout()調用沒有相應的ResumeLayout()調用。這種行爲不是我所期望的。每天學些新東西!感謝您的期待!

0

確保您從正確的線程處操作UI至關重要。我建議使用下面的擴展methdds

public delegate void EmptyHandler(); 
public delegate void ParamHandler(params object[] args); 

public static void SafeCall(this Control control, 
         ParamHandler method, params object[] args) 
{ 
    if (control.InvokeRequired) 
    { 
     control.Invoke(method, args); 
    } 
    else 
    { 
     method(args); 
    } 
} 
public static void SafeCall(this Control control, EmptyHandler method) 
{ 
    if (control.InvokeRequired) 
    { 
     control.Invoke(method); 
    } 
    else 
    { 
     method(); 
    } 
} 

,那麼你可以從不正確的線程中調用適當的方法是這樣

{ ... background thread 

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     this.SafeCall(SetImage, e.Result); 
    } 

} 

這就要求用正確的線程方法SetImage(Bitmap bitmap)