Читаем C# 4.0 полное руководство - 2011 полностью

Console.WriteLine("MyTask №" + Task.Currentld + " запущен");

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

Thread.Sleep(500);

Console.WriteLine("В методе MyTask #" + Task.Currentld +

", подсчет равен " + count );

}

Console.WriteLine("MyTask №" + Task.Currentld + " завершен");

}

static void Main {

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

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

Task tsk = new Task(MyTask);

Task tsk2 = new Task(MyTask);

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

Console.WriteLine("Идентификатор задачи tsk: " + tsk.Id); Console.WriteLine("Идентификатор задачи tsk2: " + tsk2.Id);

// Приостановить выполнение метода Main до тех пор,

// пока не завершатся обе задачи tsk и tsk2 tsk.Wait ; tsk2 .Wait ;

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

}

}

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

Основной поток запущен Идентификатор задачи tsk: 1 Идентификатор задачи tsk2: 2 MyTask №1 запущен MyTask №2 запущен

MyTask №1 завершен

В методе MyTaskO №2, подсчет равен 9

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

Как следует из приведенного выше результата, выполнение метода Main приостанавливается до тех пор, пока не завершатся обе задачи tsk и tsk2. Следует, однако, иметь в виду, что в рассматриваемой здесь программе последовательность завершения задач tsk и tsk2 не имеет особого значения для вызовов метода Wait . Так, если первой завершается задача tsk2, то в вызове метода tsk. Wait будет по-прежнему ожидаться завершение задачи tsk. В таком случае вызов метода tsk2 . Wait приведет к выполнению и немедленному возврату из него, поскольку задача tsk2 уже завершена.

В данном случае оказывается достаточно двух вызовов метода Wait , но того же результата можно добиться и более простым способом, воспользовавшись методом Wait АН . Этот метод организует ожидание завершения группы задач. Возврата из него не произойдет до тех пор, пока не завершатся все задачи. Ниже приведена простейшая форма объявления этого метода.

public static void WaitAll(params Task[]tasks)

Задачи, завершения которых требуется ожидать, передаются с помощью параметра в виде массива tasks. А поскольку этот параметр относится к типу params, то данному методу можно отдельно передать массив объектов типа Task или список задач. При этом могут быть сгенерированы различные исключения, включая и AggregateException.

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

tsk.Wait ; tsk2.Wait ;

на

Task.WaitAll(tskf tsk2);

Программа будет работать точно так же, но логика ее выполнения станет более понятной.

Организуя ожидание завершения нескольких задач, следует быть особенно внимательным, чтобы избежать взаимоблокировок. Так, если две задачи ожидают завершения друг друга, то вызов метода WaitAll вообще не приведет к возврату из него. Разумеется, условия для взаимоблокировок возникают в результате ошибок программирования, которых следует избегать. Следовательно, если вызов метода WaitAll не приводит к возврату из него, то следует внимательно проанализировать, могут ли две задачи или больше взаимно блокироваться. (Вызов метода Wait , который не приводит к возврату из него, также может стать причиной взаимоблокировок.)

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

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

Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT