Чтение онлайн

ЖАНРЫ

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

public Task(Action действие)

где действие обозначает точку входа в код, представляющий задачу, тогда как Action — делегат, определенный в пространстве имен System. Форма делегата Action, которой мы собираемся воспользоваться, выглядит следующим образом.

public delegate void Action

Таким образом, точкой входа должен служить

метод, не принимающий никаких параметров и не возвращающий никаких значений. (Как будет показано далее, делегату
Action можно также передать аргумент.)

Как только задача будет создана, ее можно запустить на исполнение, вызвав метод Start . Ниже приведена одна из его форм.

public void Start

После вызова метода Start планировщик задач запланирует исполнение задачи. В приведенной ниже программе все изложенное выше демонстрируется на практике. В этой программе отдельная задача создается на основе метода MyTask . После того как начнет выполняться метод Main , задача фактически создается и запускается на исполнение. Оба метода MyTask и Main выполняются параллельно.

// Создать и запустить задачу на исполнение.

using System;

using System.Threading;

using System.Threading.Tasks;

class DemoTask {

static void MyTask {

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

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

Thread.Sleep(500);

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

}

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

}

static void Main {

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

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

Task tsk = new Task(MyTask);

// Запустить задачу на исполнение, tsk.Start ;

// метод Main активным до завершения метода MyTask. for(int i = 0; i < 60; i++) {

Console.Write(".");

Thread.Sleep(100);

}

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

}

}

Ниже приведен результат выполнения этой программы. (У вас он может несколько отличаться в зависимости от загрузки задач, операционной системы и прочих факторов.)

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

.MyTask запущен

MyTask завершен

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

Следует иметь в виду, что по умолчанию задача исполняется в фоновом потоке. Следовательно, при завершении создающего потока завершается и сама задача. Именно поэтому в рассматриваемой здесь программе метод Thread. Sleep С) использован для сохранения активным

основного потока до тех пор, пока не завершится выполнение метода
MyTask . Как и следовало ожидать, организовать ожидание завершения задачи можно и более совершенными способами, что и будет показано далее.

В приведенном выше примере программы задача, предназначавшаяся для параллельного исполнения, обозначалась в виде статического метода. Но такое требование к задаче не является обязательным. Например, в приведенной ниже программе, которая является переработанным вариантом предыдущей, метод MyTask , выполняющий роль задачи, инкапсулирован внутри класса.

// Использовать метод экземпляра в качестве задачи.

using System;

using System.Threading;

using System.Threading.Tasks;

class MyClass {

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

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

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

Thread.Sleep(500);

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

}

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

}

}

class DemoTask {

static void Main {

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

// Сконструировать объект типа MyClass.

MyClass me = new MyClass;

// Сконструировать объект задачи для метода mc.MyTask.

Task tsk = new Task(me.MyTask);

// Запустить задачу на исполнение, tsk.Start;

// Сохранить метод Main активным до завершения метода MyTask. for(int i = 0; i < 60; i++) {

Console.Write (".");

Thread.Sleep (100);

}

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

}

}

Результат выполнения этой программы получается таким же, как и прежде. Единственное отличие состоит в том, что метод MyTask вызывается теперь для экземпляра объекта класса MyClass.

В отношении задач необходимо также иметь в виду следующее: после того, как задача завершена, она не может быть перезапущена. Следовательно, иного способа повторного запуска задачи на исполнение, кроме создания ее снова, не существует.

Применение идентификатора задачи

В отличие от класса Thread; в классе Task отсутствует свойство Name для хранения имени задачи. Но вместо этого в нем имеется свойство Id для хранения идентификатора задачи, по которому можно распознавать задачи. Свойство Id доступно только для чтения и относится к типу int. Оно объявляется следующим образом.

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