![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Параллелизм на уровне задач
Параллелизм на уровне задач – базовый элемент TPL. Задача (task) – сущность, которая в целом подобна потоку. Основное различие заключается в том, что исполнением задач управляет специальный планировщик, опирающийся в своей работе на пул потоков. Для представления задач используются классы Task и Task< T>, размещённые в пространстве имён System.Threading.Tasks. Табл. 20 содержит описание элементов класса Task. Таблица 20 Элементы класса Task
Для создания задачи используется один из перегруженных конструкторов класса Task. При этом указывается аргумент типа Action – метод, выполняемый в задаче. Если необходим метод с параметром, используется Action< object> и дополнительный аргумент типа object. Action m1 = () => { Thread.Sleep(2000); Console.WriteLine(" Done"); };
Action< object> m2 = obj => { Thread.Sleep(1000); Console.WriteLine(obj.ToString()); };
var t1 = new Task(m1); var t2 = new Task(m2, 25); Перегруженные конструкторы класса Task принимают опциональные аргументы типа CancellationToken и TaskCreationOptions. Перечисление TaskCreationOptions задаёт вид задачи (например, LongRunning – долгая задача). Структура CancellationToken применяется для прерывания задачи. var t1 = new Task(m1, TaskCreationOptions.LongRunning); Созданная задача ставится в очередь планировщика и запускается при помощи методов Start() или RunSynchronously(). Второй метод запускает задачу в текущем потоке. Оба метода могут принимать аргумент типа TaskScheduler (пользовательский планировщик задач). // используем задачи t1 и t2, объявленные выше t1.Start(); // асинхронный запуск t2.RunSynchronously(); // синхронный запуск Console.WriteLine(" Tasks were started"); // напечатано через 1 сек. Метод ContinueWith() позволяет создать цепочку задач. Этот метод принимает объект-делегат, инкапсулирующий метод продолжения. Метод ContinueWith() можно вызвать как до, так и после старта задачи. t1.ContinueWith(task => Console.WriteLine(" After task " + task.Id)); Методы Wait(), WaitAll() и WaitAny() останавливают основной поток до завершения задачи (или задач). Перегруженные версии методов позволяют задать период ожидания завершения и токен отмены. t1.Wait(1000); Task.WaitAll(t1, t2); Класс Task< T> наследуется от Task и описывает задачу, возвращающую значение типа T. Дополнительно к элементам базового класса, Task< T> объявляет свойство Result для хранения вычисленного значения. Конструкторы класса Task< T> принимают аргументы типа Func< T> и Func< object, T> (опционально – аргументы типа CancellationToken и TaskCreationOptions). Func< int> func = () => { Thread.Sleep(2000); return 100; };
var task = new Task< int> (func); Console.WriteLine(task.Status); // Created
task.Start(); Console.WriteLine(task.Status); // WaitingToRun
task.Wait(); Console.WriteLine(task.Result); // 100 Класс TaskFactory содержит набор методов, соответствующих некоторым сценариям использования задач – StartNew(), FromAsync(), ContinueWhenAll(), ContinueWhenAny(). Экземпляр TaskFactory доступен через статическое свойство Task.Factory. Task.Factory.StartNew(() => { Thread.Sleep(2000); Console.WriteLine(" Done"); });
|