Книга: 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(). Вы сразу же заметите, что это приведет к исключительной ситуации.

Оглавление книги


Генерация: 0.864. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз