2009-10-30 69 views
1

以下方法從UserControl的構造函數啓動。跨線程異常被拋出,但我不知道爲什麼:意外的跨線程異常

public override void Populate() 
{ 
    base.Populate(); 
    LoadEditableList(IEditableList); 

    ThreadStart fix = null; 
    fix = delegate() 
    { 
    if (InvokeRequired) 
    { 
    Invoke(fix); 
    } 
    else 
    { 
    buttonAdd_Click(null, null); 
    } 
    }; 
    var thread = new Thread(fix); 
    thread.Start(); 
} 

的buttonAdd_Click方法添加一個項目到ListView。奇怪的是,如果向if (InvokeRequired)行添加斷點,我會避免出現此錯誤。這與我寫過幾十次的模式非常相似,我懷疑我因爲新生兒無睡眠綜合徵而缺少了一些東西。

回答

2

我相信InvokeRequired不會返回適當的值,直到窗口句柄已被構造。你的構造函數中的行蹤是否被調用?

只是一個測試,如果你打電話Control.Handle第一,像這樣:

IntPtr handle = Handle; 

Populate方法的頂部,有何幫助?我並不是說這是一個永久性的修復,但如果你進入調試器,它會保持工作狀態 - 它將訪問Handle屬性來顯示它,這將強制創建句柄。

與負責其父窗口的線程相比,此構造函數運行的線程是什麼?特定窗口中的所有控件都應使用相同的UI線程。

+0

我認爲你是對的。我通過將填充方法綁定到VisibleChanged事件來解決問題。謝謝。 – 2009-10-30 18:06:12

1

您可能會遇到已知問題,請參閱hereherehere以瞭解更多信息。