2

ここで理解しようとしている主にスパゲッティ コード (C#/VB の組み合わせ) をいくつか継承しました。

これは、次の形式のデリゲートの DynamicInvoke メソッドを呼び出すことによって行われる、リモート オブジェクトへのイベントを発生させるための 2 つの連続した呼び出しがあるという、非常に奇妙な状況のようです。

delegate1.DynamicInvoke(args1);
// some code here
delegate2.DynamicInvoke(args2);

delegate1 と delegate2 はどちらも、同じリモート「サブスクライバー」オブジェクトのメソッドを参照しています。

ドキュメントで読むことができるすべてによると、DynamicInvokeは同期する必要があるようです。しかし、リモート プロセスにブレークポイントを設定すると、デリゲート 1 とデリゲート 2 によって参照されるメソッドが異なるスレッドで同時に実行されていることが目の前でわかります。

これは別のマイクロソフトの「文書化されていない機能」ですか? 私はこれを期待すべきでしたか?なぜこれが必要なのかについての説明はありますか?また、非同期で実行することを意図している場合、DynamicInvoke はどのようにして戻り値を取得できるのでしょうか?

ありがとう!シャウル

4

2 に答える 2

2

DynamicInvoke は間違いなく同期操作です。ただし、問題は、それが指すデリゲートが同期していないことです。たとえば、次のコードは Console.WriteLine() を非同期的に呼び出します。

Action write = () => Console.WriteLine("foo");
Action del1 = () => { ThreadPool.QueueUserWorkItem(write); }
...
del1.DynamicInvoke();

del1 は同期的に実行されますが、非同期作業項目が作成されます。

デリゲートが実行しているコードを探して、内部で asyc マジックを実行しているかどうかを確認します。

于 2009-01-06T14:15:29.683 に答える