Продолжения предыдущих задач
Метод ContinueWhenAll() используется для того, что бы выполнить продолжение конкретной задачи, после выполнения нескольких предыдущих задач:
Task<int> task1 = Task.Factory.StartNew (() => 200);
Task<int> task2 = Task.Factory.StartNew (() => 200);
Task<int> task3 = Task<int>.Factory.ContinueWhenAll (
new[] { task1, task2 }, tasks => tasks.Sum (t => t.Result));
Console.WriteLine (task3.Result);
увеличить изображение
Рис. 7.11.Результат выполнения программы с использование метода Метод ContinueWhenAll()
Несколько продолжений одной задачи
Метод ContinueWith() позволяет создавать несколько продолжений одной задачи. Когда предыдущая задача завершается, все продолжения запускаются одновременно. Пример использования метода ContinueWith()представлен ниже:
var t = Task.Factory.StartNew (() => Thread.Sleep (1000));
t.ContinueWith (main => Console.Write ("X"));
t.ContinueWith (main => Console.Write ("Y"));
увеличить изображение
Рис. 7.12.Результат выполнения программы с использование метода ContinueWith()
Планировщики заданий и пользовательский интерфейс
Планировщик задач (task scheduler) назначает задания определенным потокам. Все задания связаны с определенным планировщиком, который представлен абстрактным классом TaskScheduler. .Net Framework предоставляет две конкретные реализации:
· Планировщик по умолчанию (default scheduler), который работает совместно с пулом потоков CLR;
· Планировщик контекста синхронизации (synchronization context scheduler), который предназначен для упрощения работы с WPF и Windows Forms, которые требуют, чтобы обращение к элементам пользовательского интерфейса и элементам управления происходило только из потока, в котором они были созданы.
Что бы в фоновом режиме получить данные от Web-сервиса и затем, на основе полученных результатов, обновить метку (label) с именем lblResult. Разбиваем эту задачу на две подзадачи:
1. Вызвать метод для получения данных от Web-сервиса (родительская задача).
2. Обновить lblResult на основе полученных результатов (задача-продолжение).
Если указать для задачи-продолжения планировщик контекста синхронизации, полученный при создании окна, можно обновить lblResult:
public partial class MyWindow : Window
{
TaskScheduler _uiScheduler; // Объявляем TaskScheduler
public MyWindow()
{
InitializeComponent();
_uiScheduler = TaskScheduler.
FromCurrentSynchronizationContext();
Task.Factory.StartNew<string> (SomeComplexWebService)
.ContinueWith (main => lblResult.Content = main.Result, _uiScheduler);
}
string SomeComplexWebService() { ... }
}
Дата добавления: 2017-06-02; просмотров: 319;