1

このコードは処理時間を通じてどのように動作しますか?(つまり、どの程度同期していますか?)

public delegate void FooDelegate(bytes[] data);
public event FooDelegate FooEvent;

FooEvent += new FooDelegate(Process_X);
FooEvent += new FooDelegate(Process_Y);
FooEvent += new FooDelegate(Process_Z);

while (receiving)
{     
   byte[] data = getRealTimeData();

   StopWatch.Start();

   FooEvent(data);

   StopWatch.Stop();

   Console.Write(StopWatch.Elapsed.Millisec));
   StopWatch.Reset();
}

いくつか質問があります:

  1. FooEventを呼び出すと、各サブスクリプションプロセスが順次/同期的に呼び出されますか?(おそらくそうだ...)
  2. 各Process_Nが終了するまでに長い時間がかかると仮定すると、各Process_Nへの呼び出しは、終了するまでチェーンをブロックしますか(つまり、次のプロセスへの呼び出し)?これが当てはまる場合、イベントがプロセスX、Y、Zを並行して呼び出すようにしてから、それらを1つずつ呼び出して順番に終了するのではなく、すべてが終了するのを待つ方法はありますか?

いくつかの確認:

  1. チャンネル登録者数が非常に多くなると、ストップウォッチで印刷される時間が長くなると思います
  2. Process_Nの処理ロジックが重くなると、StopWatchによって出力される時間にも影響します。
4

2 に答える 2

1

イベントハンドラーは実際に順次かつ同期的に実行されるため、並列化の恩恵を受けるようです。

カスタムイベントハンドラーを作成するには、次のように記述します。

public event FooDelegate FooEvent
{
    add
    {
        // code to add an event handler
    }
    remove
    {
        // code to remove an event handler
    }
} 

カスタムイベントハンドラーの処理の詳細については、次の質問を参照してください。

デリゲートとイベントに関するJonSkeetのページ。

于 2012-07-17T12:00:19.127 に答える
1

1:はい2:はいイベントが結果を返す可能性があります。

ただし、イベントハンドラーは、実行に時間がかからないように実装する必要があります。彼らが重労働をしなければならない場合は、イベントハンデラーで開始されるタスクで計算を実行することを検討してください。

于 2012-07-17T10:39:09.257 に答える