2008-09-17 2 views
15

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

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

ответ

3

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

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

+0

Это самое лучшее с моим приложением, бросая петлю в backgroundworker, не совсем соответствует тому, как я хочу справиться с этим. – 2008-09-17 09:59:48

8

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

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

+0

Я должен согласиться, BackgroundWorker - самый красивый и чистый способ. – 2008-09-17 07:18:14

0

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

0

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

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

Смежные вопросы