759
Задания
ВниМание
При.вызове.потоком.метода.Wait.система.проверяет,.началось.ли.выполнение.задания.
Task,.которого.ожидает.поток .В.случае.положительного.результата.проверки.поток,.
вызывающий.метод.Wait,.блокируется.до.завершения.задания .Но.если.задание.еще.
не.начало.выполняться,.система.может.(в.зависимости.от.объекта.TaskScheduler).
выполнить.его.при.помощи.потока,.вызывающего.метод.Wait .В.этом.случае.дан-
ный.поток.не.блокируется .Он.выполняет.задание.Task.и.немедленно.возвращает.
управление .Это.снижает.затраты.ресурсов.(вам.не.приходится.создавать.поток.
взамен.заблокированного),.повышает.производительность.(на.создание.потока.
и.переключение.контекста.не.тратится.время) .Однако.и.это.может.быть.не.очень.
хорошо .Например,.если.перед.вызовом.метода.Wait.в.рамках.синхронизации.потока.
происходит.его.блокирование,.а.затем.задание.пытается.получить.доступ.к.тем.же.
запертым.ресурсам,.возникает.взаимная.блокировка.(deadlock)!
Если вычислительное задание генерирует необработанное исключение, оно по-
глощается и сохраняется в коллекции, а потоку пула разрешается вернуться в пул.
Затем при вызове метода
Wait
или свойства
Result
эти члены вбросят исключение
System.AggregateException
.
Тип
AggregateException
инкапсулирует коллекцию исключений (которые
генерируются, если родительское задание порождает многочисленные дочерние
задания, приводящие к исключениям). Он содержит свойство
InnerExceptions
,
возвращающее объект
ReadOnlyCollection
. Не следует путать его со
свойством
InnerException
, наследуемым классом
AggregateException
от своего
базового класса
System.Exception
. Скажем, в показанном ранее примере элемент 0
свойства
InnerExceptions
класса
AggregateException
будет ссылаться на объект
System.OverflowException
, порождаемый вычислительным методом (
Sum
).
Для удобства класс
AggregateException
переопределяет метод
GetBaseException
класса
Exception
. Эта реализация возвращает исключение с максимальным уров-
нем вложенности, которое и считается источником проблемы (предполагается,
что такое исключение в коллекции всего одно). Класс
AggregateException
также
предлагает метод
Flatten
, создающий новый экземпляр
AggregateException
,
свойство
InnerExceptions
которого содержит список исключений, вброшенных
после перебора внутренней иерархии исключений первоначального объекта. Ну
и наконец, данный класс содержит метод
Handle
, вызывающий для каждого из
исключений в составе
AggregateException
метод обратного вызова. Этот метод
выбирает способ обработки исключения. Для обрабатываемых исключений он
возвращает значение
true
, для необрабатываемых, соответственно, —
false
. Если
после вызова метода
Handle
остается хотя бы одно необработанное исключение,
создается новый объект
AggregateException
. Впрочем, с методами
Flatten
и
Handle
мы подробно познакомимся чуть позже.
Можно ожидать завершения не только одного задания, но и массива объектов
Task
. Для этого в одноименном классе существует два статических метода. Ме-
тод
WaitAny
блокирует вызов потоков до завершения выполнения всех объектов
в массиве
Task
. Этот метод возвращает индекс типа
Int32
в массив, содержащий
760
Do'stlaringiz bilan baham: |