Поделиться через


Класс task (среда выполнения с параллелизмом)

Класс task библиотеки параллельных шаблонов (PPL). task Объект представляет работу, которая может выполняться асинхронно и параллельно с другими задачами, а также параллельной работой, создаваемой параллельными алгоритмами в среде выполнения Concurrency. При успешном завершении он выводи результат типа _ResultType. Задачи типа task<void> никакого результата не дают. Задачи можно приостанавливать и отменять независимо от других задач. Кроме того, его можно составить с другими задачами с помощью шаблонов продолжения (then), join(when_all) и choice(when_any). Когда объект задачи назначается новой переменной, поведение похоже на std::shared_ptr; другими словами, оба объекта представляют одну и ту же базовую задачу.

Синтаксис

template <>
class task<void>;

template<typename _ResultType>
class task;

Параметры

_ResultType
Тип результата, создаваемого задачей.

Участники

Общедоступные typedefы

Имя Описание
result_type Тип результата, выводимого объектом этого класса.

Открытые конструкторы

Имя Описание
задача Перегружен. Формирует объект task.

Открытые методы

Имя Описание
Получить Перегружен. Возвращает результат, созданный этой задачей. Если задача не находится в конечном состоянии, вызов get будет ожидать завершения задачи. Этот метод не возвращает значение при вызове для задачи с параметром result_type, равным void.
is_apartment_aware Определяет, распаковывает ли задача интерфейс среды выполнения Windows IAsyncInfo или наследуется от такой задачи.
завершено Определяет, завершена ли задача.
планировщик Возвращает планировщик для этой задачи
тогда Перегружен. Добавляет последующую задачу к этой задаче.
ждать Ожидает, когда эта задача достигнет конечного состояния. У wait существует возможность выполнения задачи встроенным образом, если все зависимости задач удовлетворены, и она еще не взята для выполнения фоновым рабочим процессом.

Открытые операторы

Имя Описание
оператор!= Перегружен. Определяет, представляют ли два объекта task различные внутренние задачи.
оператор = Перегружен. Заменяет содержимое одного объекта task другим.
оператор == Перегружен. Определяет, представляют ли два объекта task одну и ту же внутреннюю задачу.

Замечания

Дополнительные сведения см. в разделе "Параллелизм задач".

Иерархия наследования

task

Требования

Заголовок: ppltasks.h

Пространство имен: конкурентность

получить

Возвращает результат, созданный этой задачей. Если задача не находится в конечном состоянии, вызов get будет ожидать завершения задачи. Этот метод не возвращает значение при вызове для задачи с параметром result_type, равным void.

_ResultType get() const;

void get() const;

Возвращаемое значение

Результат задачи.

Замечания

Если задача отменена, вызов get приведет к выбросу исключения task_canceled. Если задача встретила другое исключение или исключение было распространено на нее из предшествующей задачи, вызов get создаст это исключение.

Внимание

В приложении Universal Windows Platform (UWP) не вызывайте concurrency::task::wait или get (wait вызывает get) в коде, который выполняется в потоке пользовательского интерфейса. В противном случае среда выполнения создает параллельность::invalid_operation, так как эти методы блокируют текущий поток и могут привести к тому, что приложение не будет отвечать. Однако можно вызвать этот метод get, чтобы получить результат предшествующей задачи в задаче-продолжении, так как результат доступен немедленно.

is_apartment_aware

Определяет, распаковывает ли задача интерфейс среды выполнения Windows IAsyncInfo или наследуется от такой задачи.

bool is_apartment_aware() const;

Возвращаемое значение

true Значение IAsyncInfo, если задача разворачивает интерфейс или является дочерней от такой задачи, false в противном случае.

Метод task::is_done (Среда выполнения параллельных вычислений)

Определяет, завершена ли задача.

bool is_done() const;

Возвращаемое значение

Значение True, если задача завершена, значение false в противном случае.

Замечания

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

оператор!=

Определяет, представляют ли два объекта task различные внутренние задачи.

bool operator!= (const task<_ResultType>& _Rhs) const;

bool operator!= (const task<void>& _Rhs) const;

Параметры

_Rhs
Задача для проведения сравнения.

Возвращаемое значение

true если объекты ссылаются на различные базовые задачи, и false в противном случае.

operator=

Заменяет содержимое одного объекта task другим.

task& operator= (const task& _Other);

task& operator= (task&& _Other);

Параметры

_Другой
Исходный объект task.

Возвращаемое значение

Замечания

Поскольку task действует как интеллектуальный указатель, после назначения копии эти объекты task представляют ту же фактическую задачу, что и _Other.

operator==

Определяет, представляют ли два объекта task одну и ту же внутреннюю задачу.

bool operator== (const task<_ResultType>& _Rhs) const;

bool operator== (const task<void>& _Rhs) const;

Параметры

_Rhs
Задача для проведения сравнения.

Возвращаемое значение

true если объекты ссылаются на ту же базовую задачу, и false в противном случае.

Метод task::scheduler (среда выполнения параллелизма)

Возвращает планировщик для этой задачи

scheduler_ptr scheduler() const;

Возвращаемое значение

Указатель на планировщик

Задача

Формирует объект task.

task();

template<typename T>
__declspec(
    noinline) explicit task(T _Param);

template<typename T>
__declspec(
    noinline) explicit task(T _Param, const task_options& _TaskOptions);

task(
    const task& _Other);

task(
    task&& _Other);

Параметры

T
Тип параметра, из которого будет создаваться задача.

_Param
Параметр, из которого будет создаваться задача. Это может быть лямбда, объект функции, task_completion_event<result_type> объект или Windows::Foundation::IAsyncInfo, если вы используете задачи в приложении Windows Runtime. Лямбда-объект или объект-функция должен быть типом, эквивалентным std::function<X(void)>, где X может быть переменной типа result_type, task<result_type> или Windows::Foundation::IAsyncInfo в приложениях модели Windows Runtime.

_TaskOptions
Параметры задачи включают токен отмены, планировщик и другие опции.

_Другой
Исходный объект task.

Замечания

Конструктор по умолчанию для task присутствует только для того, чтобы задачи могли использоваться внутри контейнеров. Собранную задачу по умолчанию невозможно использовать до тех пор, пока ей не будет присвоена допустимая задача. Такие методы, как get, wait или then, вызовут исключение invalid_argument при вызове задачи, созданной по умолчанию.

Задача, которая создается из task_completion_event, завершится (и ее продолжения будут запланированы), если событие завершения задачи установлено.

Версия конструктора, принимающего токен отмены, создает задачу, которую можно отменить с помощью cancellation_token_source, из которого был получен токен. Задачи, созданные без токена отмены, не могут быть отменены.

Задачи, созданные из интерфейса Windows::Foundation::IAsyncInfo или лямбда-выражения, которое возвращает интерфейс IAsyncInfo, достигают своего конечного состояния при завершении вложенной асинхронной операции или действия среды выполнения Windows. Аналогичным образом задачи, созданные из лямбда-функций, которые возвращают task<result_type>, достигают своего конечного состояния, когда внутренняя задача достигает своего конечного состояния, а не когда лямбда-функция выполняется.

task ведет себя подобно умному указателю и его можно безопасно передавать по значению. К ней также может быть получен доступ несколькими потоками без необходимости использования блокировки.

Перегрузки конструктора, принимающие интерфейс Windows::Foundation::IAsyncInfo или лямбду, возвращающую такой интерфейс, доступны только для приложений среды выполнения Windows.

Дополнительные сведения см. в разделе "Параллелизм задач".

затем

Добавляет последующую задачу к этой задаче.

template<typename _Function>
__declspec(
    noinline) auto then(const _Function& _Func) const -> typename details::_ContinuationTypeTraits<_Function,
    _ResultType>::_TaskOfType;

template<typename _Function>
__declspec(
    noinline) auto then(const _Function& _Func,
    const task_options& _TaskOptions) const -> typename details::_ContinuationTypeTraits<_Function,
    _ResultType>::_TaskOfType;

template<typename _Function>
__declspec(
    noinline) auto then(const _Function& _Func,
    cancellation_token _CancellationToken,
    task_continuation_context _ContinuationContext) const -> typename details::_ContinuationTypeTraits<_Function,
    _ResultType>::_TaskOfType;

template<typename _Function>
__declspec(
    noinline) auto then(const _Function& _Func,
    const task_options& _TaskOptions = task_options()) const -> typename details::_ContinuationTypeTraits<_Function,
    void>::_TaskOfType;

template<typename _Function>
__declspec(
    noinline) auto then(const _Function& _Func,
    cancellation_token _CancellationToken,
    task_continuation_context _ContinuationContext) const -> typename details::_ContinuationTypeTraits<_Function,
    void>::_TaskOfType;

Параметры

_Функция
Тип объекта функции, который будет вызываться этой задачей.

_Func
Функция продолжения, которая должна быть выполнена по завершении этой задачи. Эта функция продолжения должна принимать в качестве входных данных переменную типа result_type или task<result_type>, где result_type — тип результата, который создает эта задача.

_TaskOptions
Параметры задачи включают токен отмены, планировщик и контекст продолжения. По умолчанию предыдущие 3 параметра наследуются от предшествующей задачи

_CancellationToken
Токен отмены, который необходимо связать с задачей продолжения. Задача продолжения, созданная без токена отмены, унаследует токен своей предшествующей задачи.

_ContinuationContext
Переменная, определяющая место выполнения продолжения. Эта переменная полезна только при использовании в приложении UWP. Дополнительные сведения см. в task_continuation_context

Возвращаемое значение

Вновь созданная задача продолжения. Тип результата возвращаемой задачи определяется значением, возвращаемым _Func.

Замечания

Перегрузки then, которые принимают лямбда или функтор, возвращающие интерфейс Windows::Foundation::IAsyncInfo, доступны только для приложений среды выполнения Windows.

Дополнительные сведения об использовании продолжения задач для создания асинхронной работы см. в разделе "Параллелизм задач".

подождите

Ожидает, когда эта задача достигнет конечного состояния. У wait существует возможность выполнения задачи встроенным образом, если все зависимости задач удовлетворены, и она еще не взята для выполнения фоновым рабочим процессом.

task_status wait() const;

Возвращаемое значение

Значение task_status, которое может быть completed или canceled. Если задача встретила исключение во время выполнения или исключение было распространено на нее из предшествующей задачи, wait вызывает это исключение.

Замечания

Внимание

В приложении на платформе Universal Windows Platform (UWP) не вызывайте wait в коде, который выполняется в потоке пользовательского интерфейса. В противном случае среда выполнения создает concurrency::invalid_operation так как этот метод блокирует текущий поток и может вызвать зависание приложения. Тем не менее, можно вызвать метод concurrency::task::get для получения результата предшествующей задачи в продолжении, основанном на задачах.

См. также

Пространство имен параллелизм