Существует несколько вариантов, но все они вращаются вокруг создания многопоточного приложения.
Простейший * подход, я думаю, заключается в использовании класса BackgroundWorker
(usage example).
Другие варианты включают использование async
и await
ключевых слов, доступных в .NET 4.5 (если вы используете эту версию dotNET). Если вы используете более старую версию и не хотите использовать BackgroundWorker
, вы можете использовать класс Task
для создания фоновых задач. Еще более примитивный метод включает использование и управление экземплярами Thread
(если класс Task
недоступен). Видя, как вы используете WF 4, некоторые из новых методов должны работать нормально. ;)
Следует отметить, что большинство людей, начинающих с многопоточности, забывают (были там, сделаны) - вы не можете получить доступ к ресурсам, принадлежащим потоку пользовательского интерфейса (основной поток вашего приложения) из другого потока! Вот почему BackgroundWorker
может быть хорошим решением для запуска, поскольку он предоставляет 2 события (ProgressChanged
и RunWorkerCompleted
), которые позволяют вам выполнять работу с пользовательским интерфейсом по мере необходимости.
* - by easyiest Я имею в виду, что проще всего начать с! Например, async
/await
лучше подходят для приложения, которое должно выполнять множество различных асинхронных операций, но опять же это не так просто, пока вы не повесите многопоточность в целом.
На самом деле вы не указали, сколько асинхронных операций будет выполняться вашим приложением, и вы упомянули, что они ограничены .NET 4.0 (так что нет async
/await
). Если вам нужно выполнить много разных операций, я бы рекомендовал использовать класс Task
.
С небольшим усилием вы можете использовать задачи для создания рабочего многопоточного приложения, не прибегая к созданию спагетти-кода, который может стать настоящим кошмаром. Это особенно полезно, если вы застряли с использованием методов асинхронизации Begin-End
в ваших сервисах - Task.Factory.FromAsync
может быть ДЕЙСТВИТЕЛЬНО полезным в этом случае. Асинхронные службы, управляемые событиями, также должны выставлять интерфейс, который использует Begin-End
.
Вы попробовали асинхронный обработчик? –
нет, PKKG. К сожалению, я использую vs2010 только с .Net 4. Я изучаю предложение Шаамаа. Не стесняйтесь получать любые дополнительные предложения – JohnZai