Лучший способ сделать события асинхронными в C # - PullRequest
15 голосов
/ 17 сентября 2008

События синхронны в C #. У меня есть это приложение, где моя основная форма запускает поток с циклом в нем, который слушает поток. Когда что-то происходит в потоке, событие запускается из цикла в основную форму.

Если основная форма медленная или показывает окно сообщения или что-то еще, цикл будет приостановлен. Как лучше обойти это? Используя обратный вызов и вызов на главной форме?

Ответы [ 5 ]

8 голосов
/ 17 сентября 2008

Поскольку вы используете форму, проще всего использовать компонент BackgroundWorker .

Класс BackgroundWorker позволяет вам запустить операцию на отдельном, специальная тема. Кропотливый операции, такие как загрузки и базы данных транзакции могут вызвать ваш пользователь интерфейс (UI), чтобы казаться, как будто это перестал отвечать, пока они Бег. Когда вы хотите адаптивный интерфейс и вы столкнулись с длительными задержками связанные с такими операциями, Класс BackgroundWorker предоставляет удобное решение.

3 голосов
/ 17 сентября 2008

Хммм, я использовал разные сценарии, которые зависели от того, что мне было нужно в то время.

Я полагаю, что BeginInvoke, вероятно, будет проще всего кодировать, так как вы почти у цели. В любом случае вы уже должны использовать Invoke, поэтому просто перейдите на BeginInvoke. Использование обратного вызова в отдельном потоке позволит выполнить то же самое (при условии, что вы используете пул потоков для постановки в очередь обратного вызова), как при использовании BeginInvoke.

1 голос
/ 17 сентября 2008

События - это просто делегаты , поэтому используйте BeginInvoke. (см. Выполнение асинхронных вызовов методов в среде .NET )

0 голосов
/ 17 сентября 2008

System.ComponentModel.BackgroundWorker действительно хорошая отправная точка. Он выполнит вашу асинхронную работу, даст вам уведомления о важных событиях и позволит лучше интегрироваться с вашими формами.

Например, вы можете активировать уведомления о прогрессе, зарегистрировав обработчик для события ProgressChanged. (что настоятельно рекомендуется, если у вас длинный асинхронный процесс, и вы не хотите, чтобы пользователь думал, что приложение зависло)

0 голосов
/ 17 сентября 2008

У вас есть несколько вариантов, как уже подробно описано, но, по моему опыту, вам лучше оставить делегатов и BeginInvoke, а вместо этого использовать BackgroundWorker (v2.0 +), поскольку это проще в использовании, а также позволяет взаимодействовать с основной формой по завершении потока. В целом, я нашел очень практичное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...