3

Control.InvokeとControl.BeginInvokeについて多くのことを読み、InvokeはのようなものSendMessage()であり、BeginInvokeのようなものであることを理解していますが、渡されたパラメーターリストがどこに格納されPostMessage()ているのかわかりません。new object[] { arg, arg, arg, ...}従来の呼び出しでは、パラメーターがスタックにプッシュされ、呼び出された関数内でポップされ、終了後に呼び出しフレームがスタックから復元されます。ヒープオブジェクトへの参照を解放して、それらを収集できるようにすることを想定しています。では、プッシュされたスタックの日付はどこに保存されますかInvokeBeginInvoke呼び出されたメソッドが終了すると、どのように破棄されますか?

また、パスパラメータを使用して新しいオブジェクト配列をロードせずに、制御メソッドを正常に呼び出すことができました。なぜこれが機能するのでしょうか?さらに良いことに、それは機能するので、なぜ私が今まで見たすべての例が新しいオブジェクト配列でそれを示しているのでしょうか?

これは私がいつも見て使用してきたものです:

BeginInvoke(FormReceiveEvent, new object[] { Event, Arg1, Arg2, Arg3 });

しかし、これも機能します。

BeginInvoke(FormReceiveEvent, Event, Arg1, Arg2, Arg3);

どんな情報やコメントも常に歓迎されます...

前もって感謝します。

4

3 に答える 3

1

パラメータを含むものはobject[]、BeginInvokeメソッドによって内部的に保存され、ターゲットデリゲートを非同期的に呼び出します。非同期呼び出しが完了すると、配列への参照が解放され、配列とその内容(他の方法では到達できない場合)を収集できるようになります。

BeginInvoke(FormReceiveEvent, Event, Arg1, Arg2, Arg3);2番目のパラメーターがBeginInvokeとして定義されているため、フォームは機能しparams object[]ます。これは、配列を明示的に作成しない場合、コンパイラが自動的に作成することを意味します。したがって、2つの呼び出しは、実行時の動作に関して同じです。


用語に関する注記:.Netのコンテキストでは、オブジェクトが「破棄された」とは、通常、オブジェクトが実装されIDisposable、そのIDisposable.Disposeメソッドが呼び出されたことを意味します。Control.BeginInvokeとのコンテキストではControl.Invoke、それは起こりません。

非同期呼び出しが終了すると、への参照object[]が解放されて収集できるようになりますが、そのメンバーのいずれかが実装されているIDisposable場合、IDisposable.Disposeメソッドは呼び出されません。オブジェクトのリソースは、収集される(または他の誰かがオブジェクトを破棄する)まで解放されません。

于 2011-08-18T03:23:00.780 に答える
0

渡されたパラメータがスタックに格納されるとは限りません。そのvaluetypeが保存されている場合のみ。それ以外の場合は、そのrefタイプのヒープを調べてrefがそこに格納されます。

この場合、同じことが当てはまります。そして、bwオブジェクト配列と個別の配列として渡すことの違いは、スタックでの割り当てだと思います。それらを個別に渡すと、より多くのスタックスペースが割り当てられます。一方、参照は、ヒープ内のN個の配列オブジェクトを指すスタックに割り当てられます。

お気軽に訂正してください。

于 2011-08-18T03:23:52.783 に答える
0

オブジェクトをControl.InvokeまたはControl.BeginInvokeに渡す場合、パラメータを「メソッド」に渡​​すことになります。これは、パラメータを他のメソッドに渡すのと同じです。ただし、Invokeとの実装に興味がある場合は、この回答BeginInvokeで確認できます。

質問の2番目の部分の意味BeginInvokeは次のとおりです。

BeginInvoke(Delegate method, params object[] args);

したがって、 paramsキーワードについて質問しています。これは、n引数または特定のタイプの配列をメソッドに渡すことができる特別なキーワードです。

paramsキーワードを使用すると、可変数の引数を取るメソッドパラメーターを指定できます。パラメーター宣言で指定されたタイプの引数のコンマ区切りリスト、または指定されたタイプの引数の配列を送信できます。引数を送信することもできません。

于 2011-08-18T03:23:55.660 に答える