Продолжение задачи в streamе пользовательского интерфейса

Существует ли «стандартный» способ указать, что продолжение задачи должно выполняться в streamе, из которого была создана начальная задача?

В настоящее время у меня есть код ниже – он работает, но отслеживание диспетчера и создание второго действия кажется ненужным накладными расходами.

dispatcher = Dispatcher.CurrentDispatcher; Task task = Task.Factory.StartNew(() => { DoLongRunningWork(); }); Task UITask= task.ContinueWith(() => { dispatcher.Invoke(new Action(() => { this.TextBlock1.Text = "Complete"; } }); 

Вызовите продолжение с помощью TaskScheduler.FromCurrentSynchronizationContext() :

  Task UITask= task.ContinueWith(() => { this.TextBlock1.Text = "Complete"; }, TaskScheduler.FromCurrentSynchronizationContext()); 

Это подходит только в том случае, если текущий контекст выполнения находится в streamе пользовательского интерфейса.

С помощью async вы просто выполните:

 await Task.Run(() => do some stuff); // continue doing stuff on the same context as before. // while it is the default it is nice to be explicit about it with: await Task.Run(() => do some stuff).ConfigureAwait(true); 

Однако:

 await Task.Run(() => do some stuff).ConfigureAwait(false); // continue doing stuff on the same thread as the task finished on. 

Если у вас есть возвращаемое значение, которое необходимо отправить в пользовательский интерфейс, вы можете использовать общую версию следующим образом:

Это вызвано MVVM ViewModel в моем случае.

 var updateManifest = Task.Run(() => { Thread.Sleep(5000); // prove it's really working! // GenerateManifest calls service and returns 'ShippingManifest' object return GenerateManifest(); }) .ContinueWith(manifest => { // MVVM property this.ShippingManifest = manifest.Result; // or if you are not using MVVM... // txtShippingManifest.Text = manifest.Result.ToString(); System.Diagnostics.Debug.WriteLine("UI manifest updated - " + DateTime.Now); }, TaskScheduler.FromCurrentSynchronizationContext()); 

Я просто хотел добавить эту версию, потому что это такой полезный stream, и я думаю, что это очень простая реализация. Я использовал это несколько раз в различных типах, если многопоточное приложение:

  Task.Factory.StartNew(() => { DoLongRunningWork(); Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { txt.Text = "Complete"; })); }); 

J ust напишите свой код как ( Но использование ContinueWith – хорошая практика, не беспокойтесь о ненужных накладных расходах для времени выполнения )

  Task task = Task.Factory.StartNew(() => { DoLongRunningWork(); Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => { this.TextBlock1.Text = "Complete"; } }); 

Поместите код Dispatcher в блок finally если вы хотите убедиться, что это будет выполняться.

Попробуйте избежать TaskScheduler.FromCurrentSynchronizationContext() поскольку от использования этого ваш stream пользовательского интерфейса может быть заблокирован вашим текущим streamом.

  • WPF. Должен ли пользовательский элемент управления иметь свой собственный ViewModel?
  • Связывание данных с SelectedItem в WPF Treeview
  • Открыть диалоговое окно каталога
  • Ускорить добавление объектов к canvasу В WPF
  • Как разместить содержимое WPF в приложениях MFC?
  • В чем разница между библиотекой пользовательского контроля и библиотекой пользовательского контроля?
  • Загрузите ResourceDictionary из сборки
  • Реализация CollectionChanged
  • Как отключить элемент списка ListBox на основе значения свойства?
  • Обнаружить, если в C # нажата какая-либо клавиша (не A, B, а любая)
  • Как связать несколько значений с одним текстовым блоком WPF?
  • Interesting Posts

    В C # Winforms есть способ поместить пунктирную границу вокруг всех элементов управления и показать точки захвата при выборе определенных элементов управления во время выполнения?

    Android: мое приложение слишком велико и дает «Невозможно выполнить dex: идентификатор метода не в : 65536»?

    Как скомпилировать несколько исходных файлов java в командной строке

    Не может получить доступ или форматировать мой USB

    Spark Error: ожидаемые нулевые аргументы для построения ClassDict (для numpy.core.multiarray._reconstruct)

    Создайте файл Excel (.XLS и .XLSX) с C #

    Передача права собственности на файл другому пользователю в скрипте Google Apps

    Функция tellg () дает неправильный размер файла?

    Android RecyclerView с GridLayoutManager делает диапазон элементов несколькими рядами

    Android WebView открывается в WebView, а не в браузере по умолчанию.

    В чем разница между User Control, Custom Control и Component?

    Как я могу выборочно отключить блокаторы пасты

    Windows: сжатие раздела жесткого диска ускорит доступ к диску?

    Отправка запроса POST от Cocoa до Tumblr

    jQuery загружает первые 3 элемента, нажмите «загрузить больше», чтобы отобразить следующие 5 элементов

    Давайте будем гением компьютера.