Лучший способ сделать события асинхронными в C#

StackOverflow https://stackoverflow.com/questions/80645

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

Поскольку вы используете форму, более простой способ — использовать ФонРабочий компонент.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top