11

ライブラリ クラスから一連のイベントを発生させたいのですが、一部のイベント サブスクライバーが失礼で、一部のイベントの処理に時間がかかり、イベントを発生させているスレッドがブロックされるのではないかと心配しています。スレッド プール スレッドを使用して各イベントを発生させることで、発生スレッドを保護できると考えました。

if (packet != null && DataPacketReceived != null)
{
    var args = new DataPacketEventArgs(packet);
    DataPacketReceived.BeginInvoke(this, args, null, null);
}

イベントのサブスクライバーが 1 つしかない場合は問題なく動作しますが、2 番目のサブスクライバーが到着するとすぐにDataPacketReceivedマルチキャスト デリゲートになり、"デリゲートにはターゲットが 1 つだけ必要です" というエラー メッセージと共に引数例外が発生します。別のスレッドでイベントを発生させる簡単な方法はありますか、またはスレッドを開始してそこからイベントを発生させる必要がありますか?

4

1 に答える 1

16

別のサイトで同様の質問を見つけました。もちろん、Jon Skeet が回答しています。私のシナリオでは、サブスクライバーごとに個別のスレッドでイベントを発生させることにしました。

if (packet != null && DataPacketReceived != null)
{
    var args = new DataPacketEventArgs(packet);
    var receivers = DataPacketReceived.GetInvocationList();
    foreach (EventHandler<DataPacketEventArgs> receiver in receivers)
    {
        receiver.BeginInvoke(this, args, null, null);
    }
}
于 2011-01-19T01:59:34.643 に答える