Я ищу варианты выполнения асинхронной диспетчеризации событий в компоненте, который имеет много подписчиков на его события. Просматривая варианты, я наткнулся на этот пример:
public event ValueChangedEvent ValueChanged;
public void FireEventAsync(EventArgs e)
{
Delegate[] delegates = ValueChanged.GetInvocationList();
foreach (Delegate d in delegates)
{
ValueChangedEvent ev = (ValueChangedEvent)d;
ev.BeginInvoke(e, null, null);
}
}
Помимо более старого синтаксиса (пример был из .NET 1.1), мне кажется, что это серьезная утечка ресурсов. Нет метода завершения, опроса завершения или любого другого способа вызова EndInvoke
.
Насколько я понимаю, каждый BeginInvoke
должен иметь соответствующий EndInvoke
. В противном случае существуют ожидающие AsyncResult
экземпляры объектов, плавающие вокруг, а также (потенциально) исключения, которые были вызваны во время асинхронных событий.
Я понимаю, что это достаточно легко изменить, предоставив обратный вызов и выполнив EndInvoke
, но если мне это не нужно. , .
Обработка асинхронных исключений - это совсем другое дело, и в сочетании с необходимостью синхронизации с потоком пользовательского интерфейса (т. Е. InvokeRequired
и т. Д.) Вполне может быть реализована идея выполнения этих асинхронных уведомлений.
Итак, два вопроса:
- Правильно ли я считаю, что каждый
BeginInvoke
требует соответствующего EndInvoke
?
- Помимо того, что я отметил выше, существуют ли другие подводные камни для выполнения асинхронных уведомлений о событиях в приложениях Windows Forms?