Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Например, следующий вызов метода StartNew () в рассматривавшихся ранее программах приведет к созданию и запуску задачи tsk одним действием.




Task tsk = Task.Factory.StartNew(MyTask);

После этого оператора сразу же начнет выполняться метод MyTask ().

Метод StartNew () оказывается более эффективным в тех случаях, когда задача создается и сразу же запускается на исполнение. Поэтому именно такой подход и применяется в последующих примерах программ.

Применение лямбда-выражения в качестве задачи

Кроме использования обычного метода в качестве задачи, существует и другой, более рациональный подход: указать лямбда-выражение как отдельно решаемую задачу. Напомним, что лямбда-выражения являются особой формой анонимных функций. Поэтому они могут исполняться как отдельные задачи. Лямбда-выражения оказываются особенно полезными в тех случаях, когда единственным назначением метода является решение одноразовой задачи. Лямбда-выражения могут составлять отдельную задачу или же вызывать другие методы. Так или иначе, применение лямбда-выражения в качестве задачи может стать привлекательной альтернативой именованному методу.

В приведенном ниже примере программы демонстрируется применение лямбда-выражения в качестве задачи. В этой программе код метода MyTask () из предыдущих примеров программ преобразуется в лямбда-выражение.

// Применить лямбда-выражение в качестве задачи.

Using System;

Using System.Threading;

Using System.Threading.Tasks;

class DemoLambdaTask { static void Main() {

Console.WriteLine("Основной поток запущен.");

// Далее лямбда-выражение используется для определения задачи.

Task tsk = Task.Factory.StartNew(() => {

Console.WriteLine("Задача запущена");

for (int count = 0; count < 10; count++) {

Thread.Sleep(500);

Console.WriteLine("Подсчет в задаче равен " + count);

}

Console.WriteLine("Задача завершена");

});

// Ожидать завершения задачи tsk. tsk.Wait();

У/ Освободить задачу tsk. tsk.Dispose();

Console.WriteLine("Основной поток завершен.");

}

}

Ниже приведен результат выполнения этой программы.

Основной поток запущен.

Задача завершена Основной поток завершен.

Помимо применения лямбда-выражения для описания задачи, обратите также внимание в данной программе на то, что вызов метода tsk. Dispose () не делается до тех пор, пока не произойдет возврат из метода tsk. Wait (). Как пояснялось в предыдущем разделе, метод Dispose () можно вызывать только по завершении задачи. Для того чтобы убедиться в этом, попробуйте поставить вызов метода tsk. Dispose () в рассматриваемой здесь программе перед вызовом метода tsk.Wait (). Вы сразу же заметите, что это приведет к исключительной ситуации.

Создание продолжения задачи

Одной из новаторских и очень удобных особенностей библиотеки TPL является возможность создавать продолжение задачи. Продолжение — это одна задача, которая автоматически начинается после завершения другой задачи. Создать продолжение можно, в частности, с помощью метода ContinueWith (), определенного в классе Task. Ниже приведена простейшая форма его объявления:

public Task ContinueWith(Action<Task> действие_продолженмя)

где действие_продолжения обозначает задачу, которая будет запущена на исполнение по завершении вызывающей задачи. У делегата Action имеется единственный параметр типа Task. Следовательно, вариант делегата Action, применяемого в данном методе, выглядит следующим образом.

public delegate void Action<in T>(T obj)

В данном случае обобщенный параметр Т обозначает класс Task.

Продолжение задачи демонстрируется на примере следующей программы.

// Продемонстрировать продолжение задачи.

Using System;

Using System.Threading;

Using System.Threading.Tasks;

class ContinuationDemo {

// Метод, исполняемый как задача, static void MyTaskO {

Console.WriteLine("MyTask() запущен");

for(int count = 0; count < 5; count++) {

Thread.Sleep(500);

Console.WriteLine("В методе MyTaskO подсчет равен " + count);

}

Console.WriteLine("MyTask завершен");

}

// Метод, исполняемый как продолжение задачи, static void ContTask(Task t) {

Console.WriteLine("Продолжение запущено");

for(int count = 0; count < 5; count++) {

Thread.Sleep(500);

Console.WriteLine("В продолжении подсчет равен " + count);

}

Console.WriteLine("Продолжение завершено");

}

static void Main() {

Console.WriteLine("Основной поток запущен.");

// Сконструировать объект первой задачи.

Task tsk = new Task(MyTask);

//А теперь создать продолжение задачи.

Task taskCont = tsk.ContinueWith(ContTask);

// Начать последовательность задач, tsk.Start ();

// Ожидать завершения продолжения. taskCont.Wait();





Поделиться с друзьями:


Дата добавления: 2016-12-03; Мы поможем в написании ваших работ!; просмотров: 370 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Вы никогда не пересечете океан, если не наберетесь мужества потерять берег из виду. © Христофор Колумб
==> читать все изречения...

2339 - | 2144 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.