task 类(并发运行时)

并行模式库 (PPL) task 类。 task 对象表示可异步执行的工作,以及可与并发运行时中的并行算法生成的其他任务一起执行的工作。 成功完成后,它将生成类型为 _ResultType 的结果。 类型为 task<void> 的任务不生成任何结果。 可独立于其他任务等待和取消的任务。 它也可通过使用 continuations(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 已重载。 返回此任务产生的结果。 如果任务不处于终止状态,则对 get 的调用将等待任务完成。 在调用 result_typevoid 的任务时,此方法不返回值。
is_apartment_aware 确定任务是否解包 Windows 运行时 IAsyncInfo 接口或继承自此类任务。
is_done 确定任务是否已完成。
计划程序 返回此任务的计划程序
然后在受影响的域控制器上,运行 已重载。 向此任务添加延续任务。
wait 等待此任务到达终止状态。 wait 可执行内联任务,前提是所有任务依赖项得到满足并且后台辅助线程没有选取它执行。

公共运算符

“属性” 说明
operator!= 已重载。 确定两个 task 对象是否表示不同的内部任务。
operator= 已重载。 将一个 task 对象的内容替换为另一个对象的内容。
operator== 已重载。 确定两个 task 对象是否表示相同的内部任务。

注解

有关详细信息,请参阅任务并行

继承层次结构

task

要求

标头:ppltasks.h

命名空间: 并发

get

返回此任务产生的结果。 如果任务不处于终止状态,则对 get 的调用将等待任务完成。 在调用 result_typevoid 的任务时,此方法不返回值。

_ResultType get() const;

void get() const;

返回值

任务的结果。

注解

如果任务已取消,则对 get 的调用将引发 task_canceled 异常。 如果任务遇到了不同的异常或异常从前面的任务传播到此任务,则对 get 的调用将引发该异常。

重要

在通用 Windows 平台 (UWP) 应用中,请勿在用户界面线程上运行的代码中调用 concurrency::task::waitgetwait 调用 get)。 否则,运行时会引发 concurrency::invalid_operation,原因是此方法阻止当前线程并可能导致应用停止响应。 但是,可以调用 get 方法来接收基于任务的延续中的先行任务的结果,因为结果是立即可用的。

is_apartment_aware

确定任务是否解包 Windows 运行时 IAsyncInfo 接口或继承自此类任务。

bool is_apartment_aware() const;

返回值

如果任务解包一个 IAsyncInfo 接口或继承自此类任务,则为 true;否则为 false

task::is_done 方法(并发运行时)

确定任务是否已完成。

bool is_done() const;

返回值

如果任务已完成,则为 True;否则为 False。

注解

如果任务完成或取消(有或没有用户异常),函数返回 true。

operator!=

确定两个 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);

参数

_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 对象。

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
从中构造任务的参数。 如果你要在 Windows 运行时应用中使用任务,则这可能是 lambda、函数对象、task_completion_event<result_type> 对象或 Windows::Foundation::IAsyncInfo。 lambda 或函数对象应该是与 std::function<X(void)> 等效的类型,其中 X 可以是 result_typetask<result_type> 类型的变量,或 Windows 运行时应用中的 Windows::Foundation::IAsyncInfo。

_TaskOptions
任务选项包括取消标记、计划程序等

_Other
task 对象。

注解

task 的默认构造函数仅用于允许在容器中使用任务。 只有在分配有效任务后才能使用默认的构造任务。 对默认构造任务调用 getwaitthen 方法时将引发 invalid_argument 异常。

通过 task_completion_event 创建的任务将在设置任务完成事件后完成(并安排好其延续)。

采用取消标记的构造函数的版本可创建能够通过使用提供标记的 cancellation_token_source 取消的任务。 创建时没有使用取消标记的任务不可取消。

通过 Windows::Foundation::IAsyncInfo 接口或返回 IAsyncInfo 接口的 lambda 创建的任务在封闭的 Windows 运行时异步操作或行为完成时达到其终止状态。 同样,通过返回 task<result_type> 的 lambda 创建的任务在内部任务达到其终止状态时达到其终止状态,而非在 lambda 返回时达到该状态。

task 行为与智能指针的行为类似,可按值安全传递。 它可以由多个线程访问,而无需锁定。

采用 Windows::Foundation::IAsyncInfo 接口或返回此类接口的 lambda 的构造函数重载仅可用于 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;

参数

_Function
此任务将调用的函数对象的类型。

_Func
此任务完成时要执行的延续函数。 此延续函数必须将 result_typetask<result_type> 的变量作为输入,其中 result_type 是此任务产生的结果的类型。

_TaskOptions
任务选项包括取消标记、计划程序和延续上下文。 默认情况下,前面的 3 个选项是从前面的任务继承的

_CancellationToken
要与延续任务相关联的取消标记。 创建时不带取消标记的延续任务将继承其前面的任务的标记。

_ContinuationContext
用于指定执行延续的位置的变量。 这个变量只有在 UWP 应用中使用时才有用。 有关详细信息,请参阅 task_continuation_context

返回值

新创建的延续任务。 返回任务的结果类型取决于 _Func 返回的内容。

注解

采用返回 Windows::Foundation::IAsyncInfo 接口的 lambda 或函子的 then 的重载仅适用于 Windows 运行时应用。

有关如何使用任务延续构成异步工作的详细信息,请参阅任务并行

wait

等待此任务到达终止状态。 wait 可执行内联任务,前提是所有任务依赖项得到满足并且后台辅助线程没有选取它执行。

task_status wait() const;

返回值

可为 task_statuscompletedcanceled 值。 如果任务在执行期间遇到了异常或异常从前面的任务传播到此任务,则 wait 将引发该异常。

注解

重要

在通用 Windows 平台 (UWP) 应用中,请勿在用户界面线程上运行的代码中调用 wait。 否则,运行时会引发 concurrency::invalid_operation ,原因是此方法阻止当前线程并可能导致应用停止响应。 但是,你可以调用 concurrency::task::get 方法来接收基于任务的延续中的先行任务的结果。

另请参阅

并发命名空间