Как следует из приведенного выше результата, выполнение методаMyTask ()отменяется в методеMain() лишь две секунды спустя. Следовательно, в методеMyTask() выполняются четыре шага цикла. Когда же перехватывается исключениеAggregateException,проверяется состояние задачи. Если задачаtskотменена, что и должно произойти в данном примере, то об этом выводится соответствующее сообщение. Следует, однако, иметь в виду, что когда сообщениеAggregateExceptionгенерируется в ответ на отмену задачи, то это еще не свидетельствует об ошибке, а просто означает, что задача была отменена.
Выше были изложены лишь самые основные принципы, положенные в основу отмены задачи и генерирования исключенияAggregateException.Тем не менее эта тема намного обширнее и требует от вас самостоятельного и углубленного изучения, если вы действительно хотите создавать высокопроизводительные, масштабируемые приложения.
Другие средства организации задач
В предыдущих разделах был описан ряд понятий и основных способов организации и исполнения задач. Но имеются и другие полезные средства. В частности, задачи можно делать вложенными, когда одни задачи способны создавать другие, или же порожденными, когда вложенные задачи оказываются тесно связанными с создающей их задачей.
В предыдущем разделе было дано краткое описание исключенияAggregateException,но у него имеются также другие особенности, которые могут оказаться весьма полезными. К их числу относится методFlatten(), применяемый для преобразования любых внутренних исключений типаAggregateExceptionв единственное исключениеAggregateException.Другой метод,Handle(), служит для обработки исключения, составляющего совокупное исключениеAggregateException.
При создании задачи имеется возможность указать различные дополнительные параметры, оказывающие влияние на особенности ее исполнения. Для этой цели указывается экземпляр объекта типаTaskCreationOptionsв конструкторе классаTaskили же в фабричном методеStartNew(). Кроме того, в классеTaskFactoryдоступно целое семейство методовFromAsync(), поддерживающих модель асинхронного программирования (АРМ — Asynchronous Programming Model).
Как упоминалось ранее в этой главе, задачи планируются на исполнение экземпляром объекта классаTaskScheduler.Как правило, для этой цели предоставляется планировщик, используемый по умолчанию в среде .NET Framework. Но этот планировщик может быть настроен под конкретные потребности разработчика. Кроме того, допускается применение специализированных планировщиков задач.
Класс Parallel