3

私のフォームのコンストラクターでは、次を呼び出します。

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

それでも、次のメッセージで恐ろしい例外が発生します。

「ウィンドウ ハンドルが作成されるまで、Invoke または BeginInvoke をコントロールで呼び出すことはできません」

AFAIK、それはすべて同じスレッドなので、なぜ例外なのですか?

4

4 に答える 4

4

label1.BeginInvokeコンストラクターからForm_Loadイベント ハンドラーに移動します。

于 2012-10-26T15:46:56.883 に答える
4

ネイティブ ウィンドウ ハンドルは、コンストラクターで作成されません。それは、フォームの Show() メソッドが呼び出された後まで発生しません。典型的な .NET の怠惰な方法で。Load イベントは、作成後に実行される最初の標準イベントです。HandleCreated イベントもありますが、複数回実行される場合があります。

ここで BeginInvoke を実際に使用する必要はほとんどありません。これは、Label1 コントロールを作成したスレッドでコードを実行するために使用することを意図しています。コンストラクターは既にそのスレッドで実行されている必要があります。そうでない場合は非常に不健康です。ラベルの描画が意図されている場合は、代わりにフォームの Shown イベントを使用します。フォームの後に実行される最初のイベントは、実際にはユーザーに表示されます。

于 2012-10-26T15:52:57.507 に答える
2

ハンドルはまだ作成されていません (作成されていると言うのはなぜですか)。ハンドルは構築時に作成されません。遅延します。.Handleコントロールのプロパティにアクセスしてハンドルの作成を強制することで、これを回避できます。

以下が役立つ場合があります。

于 2012-10-26T15:53:36.563 に答える
0

BeginInvoke を呼び出さないでください。理由はありません。コントロールのコンストラクターでは、既に適切な UI スレッドにいる方がよいでしょう。

于 2012-10-26T15:55:29.403 に答える