Герберт Шилдт - C# 4.0: полное руководство

Тут можно читать онлайн Герберт Шилдт - C# 4.0: полное руководство - бесплатно ознакомительный отрывок. Жанр: comp-programming, издательство ООО И.Д. Вильямс, год 2011. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    C# 4.0: полное руководство
  • Автор:
  • Жанр:
  • Издательство:
    ООО И.Д. Вильямс
  • Год:
    2011
  • Город:
    Москва -- Киев
  • ISBN:
    978-5-8459-1684-6
  • Рейтинг:
    3.93/5. Голосов: 141
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Герберт Шилдт - C# 4.0: полное руководство краткое содержание

C# 4.0: полное руководство - описание и краткое содержание, автор Герберт Шилдт, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.


Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок

C# 4.0: полное руководство - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Герберт Шилдт
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Ниже приведен вариант предыдущей программы, измененный с целью продемонстрировать применение метода Wait()на практике. Этот метод используется внутри метода Main(), чтобы приостановить его выполнение до тех пор, пока не завершатся обе задачи tsk и tsk2.

// Применить метод Wait().

using System;

using System.Threading;

using System.Threading.Tasks;

class DemoTask {

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

static void MyTask() {

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

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

Thread.Sleep(500);

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

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

}

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

}

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, подсчет равен 0

В методе MyTask() #2, подсчет равен 0

В методе MyTask() #2, подсчет равен 1

В методе MyTask() #1, подсчет равен 1

В методе MyTask() #2, подсчет равен 2

В методе MyTask() #1, подсчет равен 2

В методе MyTask() #2, подсчет равен 3

В методе MyTask() #1, подсчет равен 3

В методе MyTask() #2, подсчет равен 4

В методе MyTask() #1, подсчет равен 4

В методе MyTask() #2, подсчет равен 5

В методе MyTask() #1, подсчет равен 5

В методе MyTask() #2, подсчет равен 6

В методе MyTask() #1, подсчет равен 6

В методе MyTask() #2, подсчет равен 7

В методе MyTask() #1, подсчет равен 7

В методе MyTask() #2, подсчет равен 8

В методе MyTask() #1, подсчет равен 8

В методе MyTask() #2, подсчет равен 9

MyTask №2 завершен

В методе MyTask() #1, подсчет равен 9

MyTask №1 завершен

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

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

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

public static void WaitAll(params Task[] tasks)

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

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

tsk.Wait();

tsk2.Wait();

на

Task.WaitAll(tsk, tsk2);

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

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

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

public static int WaitAny(params Task[] tasks)

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

Попробуйте применить метод WaitAny()на практике, подставив в предыдущей программе следующий вызов.

Task.WaitAny(tsk, tsk2);

Теперь, выполнение метода Main()возобновится, а программа завершится, как только завершится одна из двух задач.

Помимо рассматривавшихся здесь форм методов Wait(), WaitAll()и WaitAny(), имеются и другие их варианты, в которых можно указывать период простоя или отслеживать признак отмены. (Подробнее об отмене задач речь пойдет далее в этой главе.)

Вызов метода Dispose()

В классе Taskреализуется интерфейс IDisposable, в котором определяется метод Dispose(). Ниже приведена форма его объявления.

public void Dispose()

Метод Dispose()реализуется в классе Task, освобождая ресурсы, используемые этим классом. Как правило, ресурсы, связанные с классом Task, освобождаются автоматически во время "сборки мусора" (или по завершении программы). Но если эти ресурсы требуется освободить еще раньше, то для этой цели служит метод Dispose(). Это особенно важно в тех программах, где создается большое число задач, оставляемых на произвол судьбы.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Герберт Шилдт читать все книги автора по порядку

Герберт Шилдт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C# 4.0: полное руководство отзывы


Отзывы читателей о книге C# 4.0: полное руководство, автор: Герберт Шилдт. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x