Invoke()は通常のメソッド呼び出しに似ていると言われました...では、なぜ人々は通常のメソッド呼び出しではなくInvokeを使用することを選択するのでしょうか。
この問題についてオンラインで検索しようとしましたが、BeginInvoke()を使用する利点は何ですか?Invoke()を使用する利点は何ですか?
Invoke()は通常のメソッド呼び出しに似ていると言われました...では、なぜ人々は通常のメソッド呼び出しではなくInvokeを使用することを選択するのでしょうか。
この問題についてオンラインで検索しようとしましたが、BeginInvoke()を使用する利点は何ですか?Invoke()を使用する利点は何ですか?
BeginInvokeデリゲートを非同期で(スレッドプールから引き出されたスレッドで)呼び出したい場合、および同期的に呼び出したい場合に使用しInvokeます。
理由の 1 つは、リフレクションを通じてメソッド シグネチャを取得し、動的に関数をインスタンス化したい場合、Invoke() がその方法です。
.Invoke()まず、言語間のミーティング ポイントのようなものを用意する必要があることに注意してください。intC# とIntegerVB.NET の関係がSystem.Int32、その両方と他の CLR 言語の関係と同じように。同様にInvoke()、どの CLR 言語にもアクセスできるものと、その構文に適した手段で追加のシンタックス シュガーを提供できるものがあります (ほとんどの場合、C# の VB スタイルの慣例や VB の C# スタイルの慣例は構文酢であると見なされます)。 ; シュガーは常に言語の残りの部分と可能な限り一致する必要があります)。
この砂糖が追加されました。一部の人々は、デリゲートを扱っていることを明確にしたい場合があります。使用しない人もいます。私はほとんどしません。すべてのシンタックス シュガーと同様に、長所と短所は正しさよりも明快さの問題です (実際、x.Invoke()in Reflectorの呼び出しを見ると、x()どちらを使用したかを Reflector が認識していないためであることがわかります)。
たとえば、何かを実行しているスレッドを変更するため。
UI コントロールは、それを作成したスレッド (実際にはメッセージ ポンプ) からのみ操作する必要があり、常に操作できることに注意してください。したがって、別のスレッドがコントロールを操作している場合 (他のスレッドの観点から同期的に)、BeginInvoke は追加のオーバーヘッドになりますが、Invoke は問題ありません (特に、少なくとも WPF では複数の呼び出しシーケンスを高速化するためのショートカットがあるためです)。内部で実行します)。
デリゲートとは何か、何のためにあるのか、そしてなぜ便利なのか、もうお分かりだと思います。
「MyDelegate」という名前の削除ゲートがある場合、「MyDelegate(foo);」または「MyDelegate.Invoke(foo);」を実行できますが、コードを確認するときに簡単に確認できるように、常に2番目のものを使用します。これは実際にはデリゲートであり、メソッドではありません。内部差はありません。