Result в классе Task, которое определяется следующим образом.

public TResult Result { get; internal set; }

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

В приведенном ниже примере программы демонстрируется возврат задачей значений. В этой программе создаются два метода. Первый из них, MyTask (), не принимает параметров, а просто возвращает логическое значение true типа bool. Второй метод, Sumlt () , принимает единственный параметр, который приводится к типу int, и возвращает сумму из значения, передаваемого в качестве этого параметра.

// Возвратить значение из задачи.

using System;

using System.Threading;

using System.Threading.Tasks;

class DemoTask {

// Простейший метод, возвращающий результат и не принимающий аргументов, static bool MyTask()    {

return true;

}

// Этот метод возвращает сумму из положительного целого значения,

// которое ему передается в качестве единственного параметра static int Sumlt(object v) { int x = (int) v; int sum = 0;

for(; х > 0; х—) sum += х;

return sum;

}

static void Main() {

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

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

Task<bool> tsk = Task<bool>.Factory.StartNew(MyTask);

Console.WriteLine('Результат после выполнения задачи MyTask: ' + tsk.Result);

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

Task<int> tsk2 = Task<int>.Factory.StartNew(Sumlt, 3);

Console.WriteLine('Результат после выполнения задачи Sumlt: ' + tsk2.Result);

tsk.Dispose(); tsk2.Dispose();

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

}

}

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

Основной поток запущен.

Результат после выполнения задачи MyTask: True Результат после выполнения Sumlt: 6 Основной поток завершен.

Помимо упомянутых выше форм класса Task<TResult> и метода StartNew<TResult>, имеются также другие формы. Они позволяют указывать другие дополнительные параметры.

Отмена задачи и обработка исключения AggregateException

В версии 4.0 среды .NET Framework внедрена новая подсистема, обеспечивающая структурированный, хотя и очень удобный способ отмены задачи. Эта новая подсистема основывается на понятии признака отмены. Признаки отмены поддерживаются в классе Task, среди прочего, с помощью фабричного метода StartNew ().

ПРИМЕЧАНИЕ

Новую подсистему отмены можно применять и для отмены потоков, рассматривавшихся в предыдущей главе, но она полностью интегрирована в TPL и PLINQ. Именно поэтому эта подсистема рассматривается в этой главе.

Отмена задачи, как правило, выполняется следующим образом. Сначала получается признак отмены из источника признаков отмены. Затем этот признак передается задаче, после чего она должна

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату