Книга: C# 4.0: полное руководство
Применение лямбда-выражения в качестве задачи
Применение лямбда-выражения в качестве задачи
Кроме использования обычного метода в качестве задачи, существует и другой, более рациональный подход: указать лямбда-выражение как отдельно решаемую задачу. Напомним, что лямбда-выражения являются особой формой анонимных функций. Поэтому они могут исполняться как отдельные задачи. Лямбда-выражения оказываются особенно полезными в тех случаях, когда единственным назначением метода является решение одноразовой задачи. Лямбда-выражения могут составлять отдельную задачу или же вызывать другие методы. Так или иначе, применение лямбда-выражения в качестве задачи может стать привлекательной альтернативой именованному методу.
В приведенном ниже примере программы демонстрируется применение лямбда-выражения в качестве задачи. В этой программе код метода 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("Основной поток завершен.");
}
}
Ниже приведен результат выполнения этой программы.
Основной поток запущен.
Задача запущена
Подсчет в задаче равен 0
Подсчет в задаче равен 1
Подсчет в задаче равен 2
Подсчет в задаче равен 3
Подсчет в задаче равен 4
Подсчет в задаче равен 5
Подсчет в задаче равен 6
Подсчет в задаче равен 7
Подсчет в задаче равен 8
Подсчет в задаче равен 9
Задача завершена
Основной поток завершен.
Помимо применения лямбда-выражения для описания задачи, обратите также внимание в данной программе на то, что вызов метода tsk.Dispose()
не делается до тех пор, пока не произойдет возврат из метода tsk.Wait()
. Как пояснялось в предыдущем разделе, метод Dispose()
можно вызывать только по завершении задачи. Для того чтобы убедиться в этом, попробуйте поставить вызов метода tsk.Dispose()
в рассматриваемой здесь программе перед вызовом метода tsk.Wait()
. Вы сразу же заметите, что это приведет к исключительной ситуации.
- Два подхода к параллельному программированию
- Класс Task
- Применение методов ожидания
- Применение класса TaskFactory для запуска задачи
- Применение лямбда-выражения в качестве задачи
- Создание продолжения задачи
- Возврат значения из задачи
- Отмена задачи и обработка исключения AggregateException
- Другие средства организации задач
- Класс Parallel
- Исследование возможностей PLINQ
- Глава 6. Офисное применение дистрибутива
- Снова выражения
- 10 Шаблоны и регулярные выражения
- Сложные выражения ActionScript
- 4.7.3. Левосторонние выражения
- 4.11. Выражения присваивания
- ВЫРАЖЕНИЯ И ОПЕРАТОРЫ
- ВЫРАЖЕНИЯ
- Сложные выражения JavaScript
- Индексы по выражениям
- Выражения в значениях по умолчанию для доменов
- Выражения в EXCEPTION