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.

Перейти на страницу:

Похожие книги