BeginInvoke()
との違いは何Invoke()
でしょうか?
主に、それぞれが何に使用されるかです。
BeginInvoke()
編集: スレッド オブジェクトを作成して、それに対して呼び出しを呼び出すことと、デリゲートに対して呼び出すことの違いは何ですか? それとも同じことですか?
ベストアンサー1
Delegate.Invoke
/BeginInvoke
またはControl.Invoke
/のどちらを意味しますかBeginInvoke
?
Delegate.Invoke
: 同じスレッド上で同期的に実行されます。Delegate.BeginInvoke
:threadpool
スレッド上で非同期的に実行します。Control.Invoke
: UI スレッドで実行されますが、呼び出し元のスレッドは完了を待ってから続行します。Control.BeginInvoke
: UI スレッド上で実行され、呼び出しスレッドは完了を待機しません。
Tim の回答では、 を使用したい場合について言及されていますBeginInvoke
が、主に 向けだったのではないかとDelegate.BeginInvoke
思います。
Windows フォーム アプリの場合、通常はを使用することをお勧めBeginInvoke
します。その場合、たとえばデッドロックを心配する必要はありませんが、次に UI を表示するときには UI が更新されていない可能性があることを理解する必要があります。特に、UI スレッドが表示目的で使用しようとしているデータを変更しないでください。たとえば、 と プロパティを持つ があり、次のようにしPerson
たFirstName
場合LastName
:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
すると、UI には「Keyser Spacey」と表示される可能性があります。(「Kevin Soze」と表示される可能性はわずかですが、メモリ モデルの奇妙さによってのみ表示されます。)
ただし、このような問題が発生しない限り、Control.BeginInvoke
の方が正しく実行しやすく、バックグラウンド スレッドが理由もなく待機する必要がなくなります。Windows Forms チームは、 をControl.BeginInvoke
「ファイア アンド フォーゲット」方式で使用できること、つまり を呼び出す必要がないことを保証していることに注意してくださいEndInvoke
。これは、一般的な非同期呼び出しには当てはまりません。通常、すべての BeginXXX には、通常はコールバック内に対応する EndXXX 呼び出しが必要です。