2012-10-26 57 views
2

在我的窗體的構造,我呼籲:的BeginInvoke聲稱控件的窗口句柄尚未創建,即使我認爲這是

InitializeComponent(); // boilerplate placed by VS, initializing controls 
label1.BeginInvoke(new InvokeDelegate(RefreshLabelDelegate)); 

然而,我得到了可怕的例外,與消息:

「調用或BeginInvoke無法控制,直到 手柄已創建的窗口被稱爲」

據我所知,這是所有同日讀,爲什麼這個例外?

回答

3

label1.BeginInvoke從構造函數移動到事件處理函數。

+0

當與@ HansPassant的解釋相結合時,這個簡短而又甜蜜的提示解決了我的問題。謝謝! –

4

在構造函數中創建本地窗口句柄而不是。在調用表單的Show()方法後,纔會發生這種情況。典型的.NET懶惰時尚。 Load事件是創建後運行的第一個標準事件。還有HandleCreated事件,但它可能會運行多次。

這實際上不太需要在這裏使用BeginInvoke,它是用來讓代碼在創建Label1控件的線程上運行。構造函數應該已經在該線程上運行,如果不是這樣,它是非常不健康的。如果繪製標籤的目的是使用Form's Shown事件,那麼在表單實際上對用戶可見的情況下運行的第一個事件。

+0

你當然解釋了爲什麼。謝謝。 +1。 –

2

句柄尚未創建(爲什麼你會這麼說)。手柄不是在施工時創建的 - 它被延遲。您可以通過訪問控件的.Handle屬性強制創建句柄來解決此問題。

下可能會有所幫助:

+0

這也是一個很好的答案。感謝+1。 –

0

不要調用BeginInvoke,沒有任何理由。在控件的構造函數中,最好已經在適當的UI線程上。

相關問題