Могу ли я использовать BeginInvoke с MulticastDelegate? - PullRequest
8 голосов
/ 19 января 2011

Я хочу вызвать серию событий из моего библиотечного класса, но я беспокоюсь, что некоторые подписчики событий будут грубыми и долго будут обрабатывать некоторые события, блокируя тем самым поток, который вызывает события.Я думал, что смогу защитить вызывающий поток, используя поток пула потоков для вызова каждого события:

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

Это прекрасно работает, когда на событие есть только один подписчик, но как только приходит второй подписчик DataPacketReceived становится многоадресным делегатом, и я получаю исключение аргумента с сообщением об ошибке: «У делегата должна быть только одна цель».Есть ли простой способ вызвать событие в отдельном потоке, или мне нужно запустить поток, а затем вызвать событие оттуда?

1 Ответ

12 голосов
/ 19 января 2011

Я нашел похожий вопрос на другом сайте , и, конечно, Джон Скит ответил на него. Для моего сценария я решил поднять событие для каждого подписчика в отдельном потоке:

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);
    }
}
...