Лучший способ сделать события асинхронными в С#
События синхронны в С#. У меня есть это приложение, где моя основная форма запускает поток с циклом в нем, который прослушивает поток. Когда что-то приходит в поток, событие запускается из цикла в основную форму.
Если основная форма медленная или отображается сообщение или что-то, цикл будет приостановлен. Каков наилучший способ обойти это? С помощью обратного вызова и вызова в основной форме?
Ответы
Ответ 1
Хммм, я использовал разные сценарии, которые зависели от того, что мне нужно в то время.
Я считаю, что BeginInvoke, вероятно, будет проще всего закодировать, так как вы почти там. В любом случае вы должны использовать Invoke уже, поэтому просто переходите к BeginInvoke. Использование обратного вызова в отдельном потоке выполнит то же самое (пока вы используете threadpool для очереди обратного вызова), используя BeginInvoke.
Ответ 2
Поскольку вы используете форму, проще использовать компонент BackgroundWorker.
Класс BackgroundWorker позволяет вам для запуска операции на отдельном, выделенный поток. Кропотливый такие операции, как загрузка и база данных транзакции могут вызвать пользователя интерфейс (UI), чтобы выглядеть так, как будто это перестали отвечать, пока они Бег. Когда вам нужен отзывчивый интерфейс и вы столкнулись с долгими задержками связанных с такими операциями, Класс BackgroundWorker предоставляет удобное решение.
Ответ 3
События - это просто делегаты, поэтому используйте BeginInvoke. (см. Создание асинхронных вызовов методов в среде .NET)
Ответ 4
У вас есть несколько вариантов, как уже подробно, но, по моему опыту, вам лучше оставить делегатов и BeginInvoke, а вместо этого использовать BackgroundWorker (v2.0 +), поскольку он проще в использовании, а также позволяет вам взаимодействовать с основной формой при завершении потока. В общем, я нашел решение, выполненное очень сильно.
Ответ 5
System.ComponentModel.BackgroundWorker - действительно хорошая отправная точка. Он будет выполнять вашу асинхронную работу, давать вам уведомления о важных событиях и имеет способы лучше интегрироваться с вашими формами.
Например, вы можете активировать уведомления о проделанной работе, зарегистрировав обработчик события ProgressChanged. (это настоятельно рекомендуется, если у вас длительный асинхронный процесс, и вы не хотите, чтобы ваш пользователь думал, что приложение застыло)