Обратите внимание, что если вы вызываете события асинхронно и обработчики должны обновить пользовательский интерфейс, им нужно будет синхронизироваться с потоком пользовательского интерфейса для обновления любых пользовательских элементов управления.Если вы генерируете события асинхронно, вы возлагаете большую нагрузку на классы, которые подписываются на ваши события: они должны знать, как выполнять синхронизацию потоков пользовательского интерфейса.
Для меня в целом Я обнаружил, что асинхронные события не стоят проблем, потому что почти всегда мне приходится обрабатывать эти события в программах пользовательского интерфейса.Я пришел к выводу, что если я хочу, чтобы события обрабатывались асинхронно, обработчик должен об этом позаботиться.
Это не сложное и быстрое правило.Ни в коем случае.Например, System.Timers.Timer
по умолчанию вызывает событие в потоке ThreadPool, но вы можете указать SynchronizingObject
, чтобы он мог синхронизироваться с потоком пользовательского интерфейса.
Если вы решили использовать асинхронные события, тогдаЯ предлагаю вам включить такое средство, как SynchronizingObject
Timer, чтобы клиенты UI могли использовать ваш класс, не разбираясь со сложностями синхронизации потоков UI.