task Class (Concurrency Runtime)

The Parallel Patterns Library (PPL) task class. A task object represents work that can be executed asynchronously and concurrently with other tasks and parallel work produced by parallel algorithms in the Concurrency Runtime. It produces a result of type _ResultType on successful completion. Tasks of type task<void> produce no result. A task can be waited upon and canceled independently of other tasks. It can also be composed with other tasks using continuations( then), and join( when_all) and choice( when_any) patterns. When a task object is assigned to a new variable, the behavior is that of std::shared_ptr; in other words, both objects represent the same underlying task.

Syntax

template <>
class task<void>;

template<typename _ResultType>
class task;

Parameters

_ResultType
The type of the result that the task produces.

Members

Public Typedefs

Name Description
result_type The type of the result an object of this class produces.

Public Constructors

Name Description
task Overloaded. Constructs a task object.

Public Methods

Name Description
get Overloaded. Returns the result this task produced. If the task is not in a terminal state, a call to get will wait for the task to finish. This method does not return a value when called on a task with a result_type of void.
is_apartment_aware Determines whether the task unwraps a Windows Runtime IAsyncInfo interface or is descended from such a task.
is_done Determines if the task is completed.
scheduler Returns the scheduler for this task
then Overloaded. Adds a continuation task to this task.
wait Waits for this task to reach a terminal state. It is possible for wait to execute the task inline, if all of the tasks dependencies are satisfied, and it has not already been picked up for execution by a background worker.

Public Operators

Name Description
operator!= Overloaded. Determines whether two task objects represent different internal tasks.
operator= Overloaded. Replaces the contents of one task object with another.
operator== Overloaded. Determines whether two task objects represent the same internal task.

Remarks

For more information, see Task Parallelism.

Inheritance Hierarchy

task

Requirements

Header: ppltasks.h

Namespace: concurrency

get

Returns the result this task produced. If the task is not in a terminal state, a call to get will wait for the task to finish. This method does not return a value when called on a task with a result_type of void.

_ResultType get() const;

void get() const;

Return Value

The result of the task.

Remarks

If the task is canceled, a call to get will throw a task_canceled exception. If the task encountered an different exception or an exception was propagated to it from an antecedent task, a call to get will throw that exception.

Important

In a Universal Windows Platform (UWP) app, do not call concurrency::task::wait or get ( wait calls get) in code that runs on the user-interface thread. Otherwise, the runtime throws concurrency::invalid_operation because these methods block the current thread and can cause the app to become unresponsive. However, you can call the get method to receive the result of the antecedent task in a task-based continuation because the result is immediately available.

is_apartment_aware

Determines whether the task unwraps a Windows Runtime IAsyncInfo interface or is descended from such a task.

bool is_apartment_aware() const;

Return Value

true if the task unwraps an IAsyncInfo interface or is descended from such a task, false otherwise.

task::is_done Method (Concurrency Runtime)

Determines if the task is completed.

bool is_done() const;

Return Value

True if the task has completed, false otherwise.

Remarks

The function returns true if the task is completed or canceled (with or without user exception).

operator!=

Determines whether two task objects represent different internal tasks.

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

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

Parameters

_Rhs
The task to compare.

Return Value

true if the objects refer to different underlying tasks, and false otherwise.

operator=

Replaces the contents of one task object with another.

task& operator= (const task& _Other);

task& operator= (task&& _Other);

Parameters

_Other
The source task object.

Return Value

Remarks

As task behaves like a smart pointer, after a copy assignment, this task objects represents the same actual task as _Other does.

operator==

Determines whether two task objects represent the same internal task.

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

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

Parameters

_Rhs
The task to compare.

Return Value

true if the objects refer to the same underlying task, and false otherwise.

task::scheduler Method (Concurrency Runtime)

Returns the scheduler for this task

scheduler_ptr scheduler() const;

Return Value

A pointer to the scheduler

task

Constructs a task object.

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);

Parameters

T
The type of the parameter from which the task is to be constructed.

_Param
The parameter from which the task is to be constructed. This could be a lambda, a function object, a task_completion_event<result_type> object, or a Windows::Foundation::IAsyncInfo if you are using tasks in your Windows Runtime app. The lambda or function object should be a type equivalent to std::function<X(void)>, where X can be a variable of type result_type, task<result_type>, or a Windows::Foundation::IAsyncInfo in Windows Runtime apps.

_TaskOptions
The task options include cancellation token, scheduler etc

_Other
The source task object.

Remarks

The default constructor for a task is only present in order to allow tasks to be used within containers. A default constructed task cannot be used until you assign a valid task to it. Methods such as get, wait or then will throw an invalid_argument exception when called on a default constructed task.

A task that is created from a task_completion_event will complete (and have its continuations scheduled) when the task completion event is set.

The version of the constructor that takes a cancellation token creates a task that can be canceled using the cancellation_token_source the token was obtained from. Tasks created without a cancellation token are not cancelable.

Tasks created from a Windows::Foundation::IAsyncInfo interface or a lambda that returns an IAsyncInfo interface reach their terminal state when the enclosed Windows Runtime asynchronous operation or action completes. Similarly, tasks created from a lambda that returns a task<result_type> reach their terminal state when the inner task reaches its terminal state, and not when the lambda returns.

task behaves like a smart pointer and is safe to pass around by value. It can be accessed by multiple threads without the need for locks.

The constructor overloads that take a Windows::Foundation::IAsyncInfo interface or a lambda returning such an interface, are only available to Windows Runtime apps.

For more information, see Task Parallelism.

then

Adds a continuation task to this task.

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;

Parameters

_Function
The type of the function object that will be invoked by this task.

_Func
The continuation function to execute when this task completes. This continuation function must take as input a variable of either result_type or task<result_type>, where result_type is the type of the result this task produces.

_TaskOptions
The task options include cancellation token, scheduler and continuation context. By default the former 3 options are inherited from the antecedent task

_CancellationToken
The cancellation token to associate with the continuation task. A continuation task that is created without a cancellation token will inherit the token of its antecedent task.

_ContinuationContext
A variable that specifies where the continuation should execute. This variable is only useful when used in a UWP app. For more information, see task_continuation_context

Return Value

The newly created continuation task. The result type of the returned task is determined by what _Func returns.

Remarks

The overloads of then that take a lambda or functor that returns a Windows::Foundation::IAsyncInfo interface, are only available to Windows Runtime apps.

For more information on how to use task continuations to compose asynchronous work, see Task Parallelism.

wait

Waits for this task to reach a terminal state. It is possible for wait to execute the task inline, if all of the tasks dependencies are satisfied, and it has not already been picked up for execution by a background worker.

task_status wait() const;

Return Value

A task_status value which could be either completed or canceled. If the task encountered an exception during execution, or an exception was propagated to it from an antecedent task, wait will throw that exception.

Remarks

Important

In a Universal Windows Platform (UWP) app, do not call wait in code that runs on the user-interface thread. Otherwise, the runtime throws concurrency::invalid_operation because this method blocks the current thread and can cause the app to become unresponsive. However, you can call the concurrency::task::get method to receive the result of the antecedent task in a task-based continuation.

See also

concurrency Namespace