編集
コードを見ると、これが Form_Load から一部の初期化を移動する方法にすぎないことは明らかですが、ユーザーがフォームを操作する前に初期化が行われます。
への呼び出しBeginInvokeは Form_load 内にあり、別のオブジェクトでは呼び出されないため、これは Form.BeginInvoke への呼び出しです。では、何が起こっているのかというと、これです。
- Form_Load は Form.BeginInvoke にデリゲートを渡します。これにより、すべてのユーザー入力メッセージよりも前にあるフォームのメッセージ キューにメッセージが入れられます。カーソルを待機カーソルに設定します。
- Form_Load が返され、残りのフォーム初期化が完了すると、この時点でフォームが表示される可能性が高くなります。
- コードがメッセージ ポンプに落ちると、最初にキューにあるのがデリゲートであることがわかり、デリゲートが実行されます。
- デリゲートが完了すると、カーソルを通常のカーソルに戻し、戻ります
- 利益!
以下元記事
BeginInvoke を呼び出すオブジェクトに依存します。オブジェクトの派生元であるControl場合、 Control.BeginInvokeはコントロールを作成したスレッドで実行されます。JaredPar の回答を参照してください。
しかし、BeginInvoke の使用には別のパターンがあります。オブジェクトがデリゲートの場合、BeginInvoke は別のスレッドでコールバックを実行します。このスレッドは、その目的のために特別に作成することができます。
public class Foo
{
...
public Object Bar(object arg)
{
// this function will run on a separate thread.
}
}
...
// this delegate is used to Invoke Bar on Foo in separate thread, this must
// take the same arguments and return the same value as the Bar method of Foo
public delegate object FooBarCaller (object arg);
...
// call this on the main thread to invoke Foo.Bar on a background thread
//
public IAsyncResult BeginFooBar(AsyncCallback callback, object arg)
{
Foo foo = new Foo();
FooBarCaller caller = new FooBarCaller (foo.Bar);
return caller.BeginInvoke (arg);
}
このパターンは、BeginInvoke がバックグラウンド スレッドではなくメイン スレッドから呼び出される理由の 1 つです。