Могу ли я использовать BeginInvoke с MulticastDelegate?

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

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

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

1 ответ

Решение

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

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);
    }
}
Другие вопросы по тегам