tarea (Clase) (Motor Runtime de simultaneidad)
La clase task
de la biblioteca de patrones de procesamiento paralelo (PPL). Un objeto task
representa el trabajo que se puede ejecutar de forma asincrónica y de forma simultánea con otras tareas y trabajos paralelos generados por los algoritmos paralelos en el Runtime de simultaneidad. Genera un resultado de tipo _ResultType
al finalizar correctamente. Las tareas de tipo task<void>
no producen ningún resultado. Es posible esperar y cancelar una tarea de forma independiente al resto de tareas. También se puede formular con otras tareas mediante continuaciones (then
), así como con patrones de combinación (when_all
) y elección (when_any
). Cuando se asigna un objeto de tarea a una nueva variable, el comportamiento es el de std::shared_ptr
; en otras palabras, ambos objetos representan la misma tarea subyacente.
Sintaxis
template <>
class task<void>;
template<typename _ResultType>
class task;
Parámetros
_ResultType
El tipo de resultado que produce la tarea.
Miembros
Definiciones de tipos públicas
Nombre | Descripción |
---|---|
result_type |
El tipo del resultado que un objeto de esta clase produce. |
Constructores públicos
Nombre | Descripción |
---|---|
task | Con sobrecarga. Construye un objeto task . |
Métodos públicos
Nombre | Descripción |
---|---|
get | Con sobrecarga. Devuelve el resultado que esta tarea generó. Si la tarea no está en un estado terminal, una llamada a get esperará a que finalice la tarea. Este método no devuelve un valor cuando se llama en una tarea con un result_type de void . |
is_apartment_aware | Determina si la tarea desempaqueta una interfaz IAsyncInfo de Windows en tiempo de ejecución o si desciende de esta tarea. |
is_done | Determina si se completa la tarea. |
scheduler | Devuelve el programador para esta tarea |
then | Con sobrecarga. Agrega una tarea de continuación a esta tarea. |
wait | Espera que esta tarea alcance un estado terminal. Es posible que wait ejecute la tarea alineada, si se cumplen todas las dependencias de tareas, y todavía no se ha detectado para la ejecución de un trabajador en segundo plano. |
Operadores públicos
Nombre | Descripción |
---|---|
operator!= | Con sobrecarga. Determina si dos objetos task representan diferentes tareas internas. |
operator= | Con sobrecarga. Reemplaza el contenido de un objeto task con otro. |
operator== | Con sobrecarga. Determina si dos objetos task representan la misma tarea interna. |
Comentarios
Para obtener más información, consulte Paralelismo de tareas.
Jerarquía de herencia
task
Requisitos
Encabezado: ppltasks.h
Espacio de nombres: simultaneidad
get
Devuelve el resultado que esta tarea generó. Si la tarea no está en un estado terminal, una llamada a get
esperará a que finalice la tarea. Este método no devuelve un valor cuando se llama en una tarea con un result_type
de void
.
_ResultType get() const;
void get() const;
Valor devuelto
Resultado de la tarea.
Comentarios
Si se cancela la tarea, una llamada a get
iniciará una excepción del tipo task_canceled. Si la tarea encontró una excepción diferente o si se propagó una excepción desde una tarea anterior, una llamada a get
iniciará esta excepción.
Importante
En una aplicación de la Plataforma universal de Windows (UWP), no llame a concurrency::task::wait o get
(wait
llama a get
) en el código que se ejecuta en el subproceso de interfaz de usuario. De lo contrario, el runtime produce concurrency::invalid_operation porque estos métodos bloquean el subproceso actual y pueden provocar que la aplicación no responda. Sin embargo, puede llamar al método get
para recibir el resultado de la tarea anterior en una continuación basada en tareas porque el resultado está disponible de inmediato.
is_apartment_aware
Determina si la tarea desempaqueta una interfaz IAsyncInfo
de Windows en tiempo de ejecución o si desciende de esta tarea.
bool is_apartment_aware() const;
Valor devuelto
true
si la tarea desencapsula una interfaz de IAsyncInfo
o si desciende de dicha tarea; en caso contrario, false
.
task::is_done (Método) (Runtime de simultaneidad)
Determina si se completa la tarea.
bool is_done() const;
Valor devuelto
True si la tarea se ha completado; false en caso contrario.
Comentarios
La función devuelve true si la tarea se completa o cancela (con o sin excepción de usuario).
operator!=
Determina si dos objetos task
representan diferentes tareas internas.
bool operator!= (const task<_ResultType>& _Rhs) const;
bool operator!= (const task<void>& _Rhs) const;
Parámetros
_Rhs
La tarea que se va a comparar.
Valor devuelto
true
si los objetos hacen referencia a distintas tareas subyacentes; en caso contrario, false
.
operator=
Reemplaza el contenido de un objeto task
con otro.
task& operator= (const task& _Other);
task& operator= (task&& _Other);
Parámetros
_Other
Objeto task
de origen.
Valor devuelto
Comentarios
Dado que task
se comporta como un puntero inteligente, después de una asignación de copia, este objeto task
representa la misma tarea real que _Other
.
operator==
Determina si dos objetos task
representan la misma tarea interna.
bool operator== (const task<_ResultType>& _Rhs) const;
bool operator== (const task<void>& _Rhs) const;
Parámetros
_Rhs
La tarea que se va a comparar.
Valor devuelto
true
si los objetos hacen referencia a la misma tarea subyacente; en caso contrario, false
.
task::scheduler (Método, Runtime de simultaneidad)
Devuelve el programador para esta tarea
scheduler_ptr scheduler() const;
Valor devuelto
Un puntero al programador
task
Construye un objeto 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);
Parámetros
T
Tipo del parámetro a partir del cual se va a construir la tarea.
_Param
Parámetro desde el que se va a construir la tarea. Esto podría ser una expresión lambda, un objeto de función, un objeto task_completion_event<result_type>
o una Windows::Foundation::IAsyncInfo si está usando tareas en la aplicación de Windows Runtime. El objeto de función o la expresión lambda debe ser un tipo equivalente a std::function<X(void)>
, donde X puede ser una variable de tipo result_type
, task<result_type>
o una Windows::Foundation::IAsyncInfo en aplicaciones de Windows Runtime.
_TaskOptions
Entre las opciones de tareas se incluyen el token de cancelación, el programador, etc.
_Other
Objeto task
de origen.
Comentarios
El constructor predeterminado de un objeto task
solo está presente para permitir que las tareas se usen dentro de los contenedores. No se puede usar una tarea construida de forma predeterminada hasta que no se le asigne una tarea válida. Los métodos, como get
, wait
o then
producirán una excepción invalid_argument cuando se llamen en una tarea construida predeterminada.
Las tareas que se creen a partir de un objeto task_completion_event
se completarán (y sus continuaciones se programarán) cuando se establezca el evento de finalización de las tareas.
La versión del constructor que toma un token de cancelación crea una tarea que se puede cancelar mediante el token cancellation_token_source
desde el que se obtuvo. Las tareas que se crean sin token de cancelación no se pueden cancelar.
Las tareas que se crean a partir de la interfaz Windows::Foundation::IAsyncInfo
o de una expresión lambda que devuelve una interfaz IAsyncInfo
alcanzan su estado de terminal cuando se completa la operación o acción asincrónica insertada en Windows Runtime. De manera similar, las tareas que se crean a partir de una expresión lambda que devuelve un task<result_type>
alcanzan su estado terminal cuando la tarea interna alcanza su estado terminal, y no cuando la expresión lambda devuelve un resultado.
El objeto task
se comporta como un puntero inteligente y se puede pasar con seguridad por valor. Varios subprocesos pueden tener acceso a este objeto sin necesidad de bloqueos.
Las sobrecargas del constructor que toman una interfaz Windows::Foundation::IAsyncInfo o una expresión lambda que devuelve este tipo de interfaz solamente están disponibles para las aplicaciones de Windows Runtime.
Para obtener más información, consulte Paralelismo de tareas.
y luego
Agrega una tarea de continuación a esta tarea.
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;
Parámetros
_Function
Tipo del objeto de función que invocará esta tarea.
_Func
Función de continuación que se va a ejecutar cuando se complete esta tarea. Esta función de continuación debe tomar como entrada una variable o un objeto result_type
o task<result_type>
, donde result_type
es el tipo del resultado que esta tarea produce.
_TaskOptions
Entre las opciones de tareas se incluyen el token de cancelación, el programador y el contexto de continuación. De forma predeterminada, las tres opciones anteriores se heredan de la tarea precedente
_CancellationToken
Token de cancelación que se va a asociar a la tarea de continuación. Las tareas de continuación que se creen sin un token de cancelación heredarán el token de la tarea que le precede.
_ContinuationContext
Variable que especifica dónde debe ejecutarse la continuación. Esta variable solo es útil cuando se usa en una aplicación para UWP. Para obtener más información, consulte task_continuation_context.
Valor devuelto
Tarea de continuación creada recientemente. El tipo de resultado de la tarea devuelta está determinado por lo que _Func
devuelve.
Comentarios
Las sobrecargas de then
que toman una expresión lambda o un functor que devuelve una interfaz Windows::Foundation::IAsyncInfo solo están disponibles para las aplicaciones de Windows Runtime.
Para obtener más información sobre el uso de continuaciones de tareas con el fin de crear trabajo asincrónico, consulte Task Parallelism.
wait
Espera que esta tarea alcance un estado terminal. Es posible que wait
ejecute la tarea alineada, si se cumplen todas las dependencias de tareas, y todavía no se ha detectado para la ejecución de un trabajador en segundo plano.
task_status wait() const;
Valor devuelto
Un valor de task_status
, que podría ser completed
o canceled
. Si la tarea encontró una excepción durante la ejecución o se propagó una excepción desde una tarea anterior, wait
producirá esta excepción.
Comentarios
Importante
En una aplicación de la Plataforma universal de Windows (UWP), no llame a wait
en el código que se ejecuta en el subproceso de interfaz de usuario. De lo contrario, el runtime produce concurrency::invalid_operation porque este método bloquea el subproceso actual y pueden provocar que la aplicación no responda. Sin embargo, puede llamar al método concurrency::task::get para recibir el resultado de la tarea anterior en una continuación basada en tareas.