Могу ли я использовать 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);
}
}