1. ホーム
  2. c#

[解決済み】Invoke()とBeginInvoke()の違いは何ですか?)

2022-04-14 14:51:33

質問

とはどう違うのでしょうか? BeginInvoke()Invoke() は?

主にそれぞれが何に使われるのか。

EDIT: スレッド化オブジェクトを作成してその上でinvokeを呼び出すのと、単に BeginInvoke() それとも同じものなのでしょうか?

どのように解決するのですか?

ということですか? Delegate.Invoke / BeginInvoke または Control.Invoke / BeginInvoke ?

  • Delegate.Invoke : 同じスレッドで同期的に実行されます。
  • Delegate.BeginInvoke : 非同期で実行され threadpool スレッドになります。
  • Control.Invoke : UIスレッドで実行されますが、呼び出し側のスレッドは完了を待って続行します。
  • Control.BeginInvoke : UIスレッドで実行され、呼び出し側のスレッドは完了を待たない。

Timの回答では、どのような場合に BeginInvoke - を対象としたものでしたが Delegate.BeginInvoke と思っています。

Windows Formsアプリの場合は、以下のようにするといいと思います。 通常 使用 BeginInvoke . この方法では、例えばデッドロックの心配をする必要はありません。しかし、次に見るときにはUIが更新されていない可能性があることを理解する必要があります。特に、UIスレッドが表示のために使おうとしているデータを修正してはいけません。例えば、もしあなたが PersonFirstNameLastName プロパティを使用しました。

person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";

そうすると、UIにはquot;Keyser Spacey"と表示されてしまうかもしれません(quot;Kevin Soze"と表示される可能性もありますが、メモリモデルの奇妙さによってのみ可能です)。

ただし、このような問題がなければ。 Control.BeginInvoke の方が簡単で、バックグラウンドスレッドが無意味に待たされるのを防ぐことができます。なお、Windows Forms チームはあなたが Control.BeginInvoke を呼び出す必要はありません。 EndInvoke . これは一般的な非同期呼び出しには当てはまりません。通常、すべてのBeginXXXには対応するEndXXXの呼び出しが必要で、通常はコールバックの中にあるはずです。