Выполнение задачи в фоновом режиме в приложении 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 ()
- не блокировать нить ui
- может предоставлять отчет о ходе работы
- может быть отменено
- поддержка многопоточных и многоядерных
- оператор присваивания '=' атомный?
- Почему объект блокировки должен быть статическим?
- Насколько дорого стоит инструкция блокировки?
- WPF загружает анимацию в отдельный stream пользовательского интерфейса? (С #)
- C ++ 11 std :: mutex в тупике Visual Studio 2012 при блокировке из DllMain ()
- Нужно ли блокировать или маркировать как изменчивые при доступе к простому булевому флагом в C #?
- Какие операции являются атомарными в C #?
- Как сделать блокировку с несколькими чтениями / одиночной записью из более простых примитивов синхронизации?
- Может ли num ++ быть атомарным для 'int num'?
- Почему блокировка (это) {...} плохая?
- Пример / учебник Mutex?
- Как создать задачу (TPL), использующую stream STA?
- java.lang.OutOfMemoryError: пространство кучи Java
С .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