Выполнение задачи в фоновом режиме в приложении WPF

пример

private void Start(object sender, RoutedEventArgs e) { int progress = 0; for (;;) { System.Threading.Thread.Sleep(1); progress++; Logger.Info(progress); } } 

Какой рекомендуемый подход (TAP или TPL или BackgroundWorker или Dispatcher или другие), если я хочу Start ()

  1. не блокировать нить ui
  2. может предоставлять отчет о ходе работы
  3. может быть отменено
  4. поддержка многопоточных и многоядерных

С .NET 4.5 (или .NET 4.0 + Microsoft.Bcl.Async ) лучшим способом является использование API на основе Task и async/await . Это позволяет использовать удобный (псевдо) последовательный рабочий процесс кода и иметь структурированную обработку исключений.

Пример:

 private async void Start(object sender, RoutedEventArgs e) { try { await Task.Run(() => { int progress = 0; for (; ; ) { System.Threading.Thread.Sleep(1); progress++; Logger.Info(progress); } }); } catch (Exception ex) { MessageBox.Show(ex.Message); } } 

Больше информации:

Async в 4.5: Включение прогресса и аннулирования в API Async .

Async и Await .

Часто задаваемые вопросы по Async / Await .

Лучший способ сделать это – использовать BackgroundWorker .

Причина, по которой я указываю это, – это специально разработанная для обработки работы в фоновом режиме, оставляя stream пользовательского интерфейса доступным и отзывчивым. Он также имеет встроенные уведомления о Progress и поддерживает Cancellation .

Я предлагаю взглянуть на несколько примеров BackgroundWorker .

Теперь, когда вы начинаете искать фонового работника, есть одна вещь Cancellation которую вам нужно будет копать глубже. Установка свойства cancel фонового рабочего не отменяет фонового рабочего, это просто повышает флагов для вашего запущенного метода, чтобы взаимодействовать через равные промежутки времени и грациозно прекращать обработку.

Вот один из моих сообщений, которые еще раз говорили об отмене фонового работника https://stackoverflow.com/a/20941072/1397504

В заключение. Asyncronous не означает многоядерные или даже многопоточные. ( WIKI )

Вы можете выполнить операцию в отдельном streamе в WPF, используя class BackgroundWorker.

проверьте этот пример Как использовать фоновый рабочий стол WPF

И читайте о classе в MSDN здесь http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

  • Блокировки повторного входа в C #
  • Чтение и запись C ++ int Atomic?
  • Использование SynchronizationContext для отправки событий обратно в пользовательский интерфейс для WinForms или WPF
  • Записи чтения / записи в C ++
  • Как поставить задачу для сна (или задержки) в C # 4.0?
  • C # ручная блокировка / разблокировка
  • Java Thread Мусор собран или нет
  • Является ли NodeJS действительно однопоточным?
  • Давайте будем гением компьютера.