Task Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Representa una operación asincrónica.
public ref class Task : IAsyncResult
public ref class Task : IAsyncResult, IDisposable
public class Task : IAsyncResult
public class Task : IAsyncResult, IDisposable
type Task = class
interface IAsyncResult
type Task = class
interface IAsyncResult
interface IDisposable
Public Class Task
Implements IAsyncResult
Public Class Task
Implements IAsyncResult, IDisposable
- Herencia
-
Task
- Derivado
- Implementaciones
Comentarios
La Task clase representa una sola operación que no devuelve un valor y que normalmente se ejecuta de forma asincrónica. Task los objetos son uno de los componentes centrales del patrón asincrónico basado en tareas. Dado que el trabajo realizado por un Task objeto normalmente se ejecuta de forma asincrónica en un subproceso de grupo de subprocesos en lugar de sincrónicamente en el subproceso de aplicación principal, puede usar la Status propiedad , así como las IsCanceledpropiedades , IsCompletedy IsFaulted para determinar el estado de una tarea. Normalmente, se usa una expresión lambda para especificar el trabajo que la tarea debe realizar.
Para las operaciones que devuelven valores, use la Task<TResult> clase .
Creación de instancias de tareas
En el ejemplo siguiente se crean y ejecutan cuatro tareas. Tres tareas ejecutan un Action<T> delegado denominado action, que acepta un argumento de tipo Object. Una cuarta tarea ejecuta una expresión lambda (un delegado Action) que se define en línea en la llamada al método de creación de tareas. Cada tarea se instancia y se ejecuta de manera diferente.
La tarea
t1se instancia mediante una llamada a un constructor de la clase Task, pero se inicia llamando a su método Start() solo después de que se haya iniciado la tareat2.Se crea una instancia de la tarea
t2y se inicia en una sola llamada de método llamando al método TaskFactory.StartNew(Action<Object>, Object).Se crea una instancia de la tarea
t3y se inicia en una sola llamada de método llamando al método Run(Action).La tarea
t4se ejecuta sincrónicamente en el subproceso principal llamando al RunSynchronously() método .
Dado que la tarea t4 se ejecuta de forma sincrónica, se ejecuta en el subproceso de aplicación principal. Las tareas restantes se ejecutan de manera asincrónica, típicamente en uno o más subprocesos de un grupo de subprocesos.
using System;
using System.Threading;
using System.Threading.Tasks;
class Example
{
static void Main()
{
Action<object> action = (object obj) =>
{
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, obj,
Thread.CurrentThread.ManagedThreadId);
};
// Create a task but do not start it.
Task t1 = new Task(action, "alpha");
// Construct a started task
Task t2 = Task.Factory.StartNew(action, "beta");
// Block the main thread to demonstrate that t2 is executing
t2.Wait();
// Launch t1
t1.Start();
Console.WriteLine("t1 has been launched. (Main Thread={0})",
Thread.CurrentThread.ManagedThreadId);
// Wait for the task to finish.
t1.Wait();
// Construct a started task using Task.Run.
String taskData = "delta";
Task t3 = Task.Run( () => {Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, taskData,
Thread.CurrentThread.ManagedThreadId);
});
// Wait for the task to finish.
t3.Wait();
// Construct an unstarted task
Task t4 = new Task(action, "gamma");
// Run it synchronously
t4.RunSynchronously();
// Although the task was run synchronously, it is a good practice
// to wait for it in the event exceptions were thrown by the task.
t4.Wait();
}
}
// The example displays output like the following:
// Task=1, obj=beta, Thread=3
// t1 has been launched. (Main Thread=1)
// Task=2, obj=alpha, Thread=4
// Task=3, obj=delta, Thread=3
// Task=4, obj=gamma, Thread=1
open System.Threading
open System.Threading.Tasks
let action =
fun (obj: obj) -> printfn $"Task={Task.CurrentId}, obj={obj}, Thread={Thread.CurrentThread.ManagedThreadId}"
// Create a task but do not start it.
let t1 = new Task(action, "alpha")
// Construct a started task
let t2 = Task.Factory.StartNew(action, "beta")
// Block the main thread to demonstrate that t2 is executing
t2.Wait()
// Launch t1
t1.Start()
printfn $"t1 has been launched. (Main Thread={Thread.CurrentThread.ManagedThreadId})"
// Wait for the task to finish.
t1.Wait()
// Construct a started task using Task.Run.
let taskData = "delta"
let t3 =
Task.Run(fun () -> printfn $"Task={Task.CurrentId}, obj={taskData}, Thread={Thread.CurrentThread.ManagedThreadId}")
// Wait for the task to finish.
t3.Wait()
// Construct an unstarted task
let t4 = new Task(action, "gamma")
// Run it synchronously
t4.RunSynchronously()
// Although the task was run synchronously, it is a good practice
// to wait for it in the event exceptions were thrown by the task.
t4.Wait()
// The example displays output like the following:
// Task=1, obj=beta, Thread=3
// t1 has been launched. (Main Thread=1)
// Task=2, obj=alpha, Thread=4
// Task=3, obj=delta, Thread=3
// Task=4, obj=gamma, Thread=1
Imports System.Threading
Imports System.Threading.Tasks
Module Example2
Public Sub Main()
Dim action As Action(Of Object) =
Sub(obj As Object)
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, obj,
Thread.CurrentThread.ManagedThreadId)
End Sub
' Construct an unstarted task
Dim t1 As New Task(action, "alpha")
' Construct a started task
Dim t2 As Task = Task.Factory.StartNew(action, "beta")
' Block the main thread to demonstrate that t2 is executing
t2.Wait()
' Launch t1
t1.Start()
Console.WriteLine("t1 has been launched. (Main Thread={0})",
Thread.CurrentThread.ManagedThreadId)
' Wait for the task to finish.
t1.Wait()
' Construct a started task using Task.Run.
Dim taskData As String = "delta"
Dim t3 As Task = Task.Run(Sub()
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, taskData,
Thread.CurrentThread.ManagedThreadId)
End Sub)
' Wait for the task to finish.
t3.Wait()
' Construct an unstarted task
Dim t4 As New Task(action, "gamma")
' Run it synchronously
t4.RunSynchronously()
' Although the task was run synchronously, it is a good practice
' to wait for it in the event exceptions were thrown by the task.
t4.Wait()
End Sub
End Module
' The example displays output like the following:
' Task=1, obj=beta, Thread=3
' t1 has been launched. (Main Thread=1)
' Task=2, obj=alpha, Thread=3
' Task=3, obj=delta, Thread=3
' Task=4, obj=gamma, Thread=1
Creación y ejecución de una tarea
Puede crear Task instancias de varias maneras. El enfoque más común es llamar al método estático Run . El Run método proporciona una manera sencilla de iniciar una tarea mediante valores predeterminados y sin necesidad de parámetros adicionales. En el ejemplo siguiente se usa el Run(Action) método para iniciar una tarea que recorre en bucle y, a continuación, se muestra el número de iteraciones de bucle:
using System;
using System.Threading.Tasks;
public class Example
{
public static async Task Main()
{
await Task.Run( () => {
// Just loop.
int ctr = 0;
for (ctr = 0; ctr <= 1000000; ctr++)
{}
Console.WriteLine("Finished {0} loop iterations",
ctr);
} );
}
}
// The example displays the following output:
// Finished 1000001 loop iterations
open System.Threading.Tasks
let main =
task {
do!
Task.Run(fun () ->
for i = 0 to 1000000 do
printfn $"Finished {i} loop iterations")
}
main.Wait()
// The example displays the following output:
// Finished 1000001 loop iterations
Imports System.Threading.Tasks
Module Example1
Public Sub Main()
Dim t As Task = Task.Run(Sub()
' Just loop.
Dim ctr As Integer = 0
For ctr = 0 To 1000000
Next
Console.WriteLine("Finished {0} loop iterations",
ctr)
End Sub)
t.Wait()
End Sub
End Module
' The example displays the following output:
' Finished 1000001 loop iterations
Una alternativa es el método estático TaskFactory.StartNew . La propiedad Task.Factory devuelve un objeto TaskFactory. Las sobrecargas del TaskFactory.StartNew método permiten especificar parámetros para pasar a las opciones de creación de tareas y un programador de tareas. En el ejemplo siguiente se usa el TaskFactory.StartNew método para iniciar una tarea. Es funcionalmente equivalente al código del ejemplo anterior.
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Task t = Task.Factory.StartNew( () => {
// Just loop.
int ctr = 0;
for (ctr = 0; ctr <= 1000000; ctr++)
{}
Console.WriteLine("Finished {0} loop iterations",
ctr);
} );
t.Wait();
}
}
// The example displays the following output:
// Finished 1000001 loop iterations
open System.Threading.Tasks
let t =
Task.Factory.StartNew(fun () ->
// Just loop.
for i = 0 to 1000000 do
printfn $"Finished {i} loop iterations")
t.Wait()
// The example displays the following output:
// Finished 1000001 loop iterations
Imports System.Threading.Tasks
Module Example3
Public Sub Main()
Dim t As Task = Task.Factory.StartNew(Sub()
' Just loop.
Dim ctr As Integer = 0
For ctr = 0 To 1000000
Next
Console.WriteLine("Finished {0} loop iterations",
ctr)
End Sub)
t.Wait()
End Sub
End Module
' The example displays the following output:
' Finished 1000001 loop iterations
Para obtener ejemplos más completos, consulte Programación asincrónica basada en tareas.
Creación y ejecución de tareas independientes
La Task clase también proporciona constructores que inicializan la tarea, pero que no la programan para su ejecución. Por motivos de rendimiento, el Task.Run método o TaskFactory.StartNew es el mecanismo preferido para crear y programar tareas de cálculo, pero en escenarios en los que se deben separar la creación y programación, puede usar los constructores y, a continuación, llamar al Task.Start método para programar la tarea para su ejecución más adelante.
Espere a que se complete una tarea
Dado que las tareas normalmente se ejecutan de forma asincrónica en un subproceso de grupo de subprocesos, el subproceso que crea e inicia la tarea continúa la ejecución en cuanto se ha creado una instancia de la tarea. En algunos casos, cuando el subproceso que realiza la llamada es el subproceso de aplicación principal, la aplicación puede finalizar antes de que la tarea comience realmente a ejecutarse. En otros casos, la lógica de la aplicación puede requerir que el subproceso que realiza la llamada continúe la ejecución solo cuando una o varias tareas hayan completado la ejecución. Puede sincronizar la ejecución del subproceso que realiza la llamada y las tareas asincrónicas que inicia llamando a un Wait método para esperar a que se completen una o varias tareas.
Para esperar a que se complete una sola tarea, puede llamar a su método Task.Wait. Una llamada al Wait método bloquea el subproceso que realiza la llamada hasta que la instancia de clase única haya completado la ejecución.
En el ejemplo siguiente se llama al método sin Wait() parámetros para esperar incondicionalmente hasta que se complete una tarea. La tarea simula el trabajo mediante una llamada al método Thread.Sleep para dormir durante dos segundos.
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static Random rand = new Random();
static void Main()
{
// Wait on a single task with no timeout specified.
Task taskA = Task.Run( () => Thread.Sleep(2000));
Console.WriteLine("taskA Status: {0}", taskA.Status);
try {
taskA.Wait();
Console.WriteLine("taskA Status: {0}", taskA.Status);
}
catch (AggregateException) {
Console.WriteLine("Exception in taskA.");
}
}
}
// The example displays output like the following:
// taskA Status: WaitingToRun
// taskA Status: RanToCompletion
open System
open System.Threading
open System.Threading.Tasks
let rand = Random()
// Wait on a single task with no timeout specified.
let taskA = Task.Run(fun () -> Thread.Sleep 2000)
printfn $"taskA Status: {taskA.Status}"
try
taskA.Wait()
printfn $"taskA Status: {taskA.Status}"
with :? AggregateException ->
printfn "Exception in taskA."
// The example displays output like the following:
// taskA Status: WaitingToRun
// taskA Status: RanToCompletion
Imports System.Threading
Imports System.Threading.Tasks
Module Example4
Public Sub Main()
' Wait on a single task with no timeout specified.
Dim taskA = Task.Run(Sub() Thread.Sleep(2000))
Console.WriteLine("taskA Status: {0}", taskA.Status)
Try
taskA.Wait()
Console.WriteLine("taskA Status: {0}", taskA.Status)
Catch e As AggregateException
Console.WriteLine("Exception in taskA.")
End Try
End Sub
End Module
' The example displays output like the following:
' taskA Status: WaitingToRun
' taskA Status: RanToCompletion
También puede esperar condicionalmente a que se complete una tarea. Los métodos Wait(Int32) y Wait(TimeSpan) bloquean el subproceso que llama hasta que la tarea finaliza o se agota el tiempo de espera, lo que ocurra primero. Dado que en el ejemplo siguiente se inicia una tarea que se suspende durante dos segundos, pero define un valor de tiempo de espera de un segundo, el subproceso de llamada se bloquea hasta que expire el tiempo de espera y antes de que la tarea haya completado la ejecución.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
// Wait on a single task with a timeout specified.
Task taskA = Task.Run( () => Thread.Sleep(2000));
try {
taskA.Wait(1000); // Wait for 1 second.
bool completed = taskA.IsCompleted;
Console.WriteLine("Task A completed: {0}, Status: {1}",
completed, taskA.Status);
if (!completed)
Console.WriteLine("Timed out before task A completed.");
}
catch (AggregateException) {
Console.WriteLine("Exception in taskA.");
}
}
}
// The example displays output like the following:
// Task A completed: False, Status: Running
// Timed out before task A completed.
open System
open System.Threading
open System.Threading.Tasks
// Wait on a single task with a timeout specified.
let taskA = Task.Run(fun () -> Thread.Sleep 2000)
try
taskA.Wait 1000 |> ignore // Wait for 1 second.
let completed = taskA.IsCompleted
printfn $"Task A completed: {completed}, Status: {taskA.Status}"
if not completed then
printfn "Timed out before task A completed."
with :? AggregateException ->
printfn "Exception in taskA."
// The example displays output like the following:
// Task A completed: False, Status: Running
// Timed out before task A completed.
Imports System.Threading
Imports System.Threading.Tasks
Module Example5
Public Sub Main()
' Wait on a single task with a timeout specified.
Dim taskA As Task = Task.Run(Sub() Thread.Sleep(2000))
Try
taskA.Wait(1000) ' Wait for 1 second.
Dim completed As Boolean = taskA.IsCompleted
Console.WriteLine("Task.Completed: {0}, Status: {1}",
completed, taskA.Status)
If Not completed Then
Console.WriteLine("Timed out before task A completed.")
End If
Catch e As AggregateException
Console.WriteLine("Exception in taskA.")
End Try
End Sub
End Module
' The example displays the following output:
' Task A completed: False, Status: Running
' Timed out before task A completed.
También puede proporcionar un token de cancelación llamando a los métodos Wait(CancellationToken) y Wait(Int32, CancellationToken). Si la propiedad IsCancellationRequested del token es true o se convierte en true mientras el método Wait se ejecuta, el método produce una excepción OperationCanceledException.
En algunos casos, es posible que desee esperar a que se complete la primera de una serie de tareas en ejecución, pero no le importa qué tarea es. Para ello, puede llamar a una de las sobrecargas del método Task.WaitAny. En el ejemplo siguiente se crean tres tareas, cada una de las cuales se suspende para un intervalo determinado por un generador de números aleatorios. El WaitAny(Task[]) método espera a que se complete la primera tarea. A continuación, en el ejemplo se muestra información sobre el estado de las tres tareas.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var tasks = new Task[3];
var rnd = new Random();
for (int ctr = 0; ctr <= 2; ctr++)
tasks[ctr] = Task.Run( () => Thread.Sleep(rnd.Next(500, 3000)));
try {
int index = Task.WaitAny(tasks);
Console.WriteLine("Task #{0} completed first.\n", tasks[index].Id);
Console.WriteLine("Status of all tasks:");
foreach (var t in tasks)
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status);
}
catch (AggregateException) {
Console.WriteLine("An exception occurred.");
}
}
}
// The example displays output like the following:
// Task #1 completed first.
//
// Status of all tasks:
// Task #3: Running
// Task #1: RanToCompletion
// Task #4: Running
open System
open System.Threading
open System.Threading.Tasks
let rnd = new Random()
let tasks =
[| for _ = 0 to 2 do
Task.Run(fun () -> rnd.Next(500, 3000) |> Thread.Sleep) |]
try
let index = Task.WaitAny tasks
printfn $"Task #{tasks[index].Id} completed first.\n"
printfn "Status of all tasks:"
for t in tasks do
printfn $" Task #{t.Id}: {t.Status}"
with :? AggregateException ->
printfn "An exception occurred."
// The example displays output like the following:
// Task #1 completed first.
//
// Status of all tasks:
// Task #3: Running
// Task #1: RanToCompletion
// Task #4: Running
Imports System.Threading
Imports System.Threading.Tasks
Module Example8
Public Sub Main()
Dim tasks(2) As Task
Dim rnd As New Random()
For ctr As Integer = 0 To 2
tasks(ctr) = Task.Run(Sub() Thread.Sleep(rnd.Next(500, 3000)))
Next
Try
Dim index As Integer = Task.WaitAny(tasks)
Console.WriteLine("Task #{0} completed first.", tasks(index).Id)
Console.WriteLine()
Console.WriteLine("Status of all tasks:")
For Each t In tasks
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status)
Next
Catch e As AggregateException
Console.WriteLine("An exception occurred.")
End Try
End Sub
End Module
' The example displays output like the following:
' Task #1 completed first.
'
' Status of all tasks:
' Task #3: Running
' Task #1: RanToCompletion
' Task #4: Running
También puede esperar a que se completen todas las tareas mediante una llamada al WaitAll método . En el ejemplo siguiente se crean diez tareas, se espera a que se completen las diez y, a continuación, se muestra su estado.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
// Wait for all tasks to complete.
Task[] tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
tasks[i] = Task.Run(() => Thread.Sleep(2000));
}
try {
Task.WaitAll(tasks);
}
catch (AggregateException ae) {
Console.WriteLine("One or more exceptions occurred: ");
foreach (var ex in ae.Flatten().InnerExceptions)
Console.WriteLine(" {0}", ex.Message);
}
Console.WriteLine("Status of completed tasks:");
foreach (var t in tasks)
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status);
}
}
// The example displays the following output:
// Status of completed tasks:
// Task #2: RanToCompletion
// Task #1: RanToCompletion
// Task #3: RanToCompletion
// Task #4: RanToCompletion
// Task #6: RanToCompletion
// Task #5: RanToCompletion
// Task #7: RanToCompletion
// Task #8: RanToCompletion
// Task #9: RanToCompletion
// Task #10: RanToCompletion
open System
open System.Threading
open System.Threading.Tasks
// Wait for all tasks to complete.
let tasks =
[| for _ = 0 to 9 do
Task.Run(fun () -> Thread.Sleep 2000) |]
try
Task.WaitAll tasks
with :? AggregateException as ae ->
printfn "One or more exceptions occurred: "
for ex in ae.Flatten().InnerExceptions do
printfn $" {ex.Message}"
printfn "Status of completed tasks:"
for t in tasks do
printfn $" Task #{t.Id}: {t.Status}"
// The example displays the following output:
// Status of completed tasks:
// Task #2: RanToCompletion
// Task #1: RanToCompletion
// Task #3: RanToCompletion
// Task #4: RanToCompletion
// Task #6: RanToCompletion
// Task #5: RanToCompletion
// Task #7: RanToCompletion
// Task #8: RanToCompletion
// Task #9: RanToCompletion
// Task #10: RanToCompletion
Imports System.Threading
Imports System.Threading.Tasks
Module Example6
Public Sub Main()
' Wait for all tasks to complete.
Dim tasks(9) As Task
For i As Integer = 0 To 9
tasks(i) = Task.Run(Sub() Thread.Sleep(2000))
Next
Try
Task.WaitAll(tasks)
Catch ae As AggregateException
Console.WriteLine("One or more exceptions occurred: ")
For Each ex In ae.Flatten().InnerExceptions
Console.WriteLine(" {0}", ex.Message)
Next
End Try
Console.WriteLine("Status of completed tasks:")
For Each t In tasks
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status)
Next
End Sub
End Module
' The example displays the following output:
' Status of completed tasks:
' Task #2: RanToCompletion
' Task #1: RanToCompletion
' Task #3: RanToCompletion
' Task #4: RanToCompletion
' Task #6: RanToCompletion
' Task #5: RanToCompletion
' Task #7: RanToCompletion
' Task #8: RanToCompletion
' Task #9: RanToCompletion
' Task #10: RanToCompletion
Tenga en cuenta que, cuando espere a que se completen una o varias tareas, las excepciones producidas en las tareas en ejecución se propagan en el subproceso que llama al Wait método , como se muestra en el ejemplo siguiente. Inicia 12 tareas, tres de las cuales se completan normalmente y tres de las cuales arrojan una excepción. De las seis tareas restantes, se cancelan tres antes de iniciarse y se cancelan tres mientras se ejecutan. Las excepciones se lanzan en la llamada al método WaitAll y se controlan mediante un bloque try/catch.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
// Create a cancellation token and cancel it.
var source1 = new CancellationTokenSource();
var token1 = source1.Token;
source1.Cancel();
// Create a cancellation token for later cancellation.
var source2 = new CancellationTokenSource();
var token2 = source2.Token;
// Create a series of tasks that will complete, be cancelled,
// timeout, or throw an exception.
Task[] tasks = new Task[12];
for (int i = 0; i < 12; i++)
{
switch (i % 4)
{
// Task should run to completion.
case 0:
tasks[i] = Task.Run(() => Thread.Sleep(2000));
break;
// Task should be set to canceled state.
case 1:
tasks[i] = Task.Run( () => Thread.Sleep(2000),
token1);
break;
case 2:
// Task should throw an exception.
tasks[i] = Task.Run( () => { throw new NotSupportedException(); } );
break;
case 3:
// Task should examine cancellation token.
tasks[i] = Task.Run( () => { Thread.Sleep(2000);
if (token2.IsCancellationRequested)
token2.ThrowIfCancellationRequested();
Thread.Sleep(500); }, token2);
break;
}
}
Thread.Sleep(250);
source2.Cancel();
try {
Task.WaitAll(tasks);
}
catch (AggregateException ae) {
Console.WriteLine("One or more exceptions occurred:");
foreach (var ex in ae.InnerExceptions)
Console.WriteLine(" {0}: {1}", ex.GetType().Name, ex.Message);
}
Console.WriteLine("\nStatus of tasks:");
foreach (var t in tasks) {
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status);
if (t.Exception != null) {
foreach (var ex in t.Exception.InnerExceptions)
Console.WriteLine(" {0}: {1}", ex.GetType().Name,
ex.Message);
}
}
}
}
// The example displays output like the following:
// One or more exceptions occurred:
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
//
// Status of tasks:
// Task #13: RanToCompletion
// Task #1: Canceled
// Task #3: Faulted
// NotSupportedException: Specified method is not supported.
// Task #8: Canceled
// Task #14: RanToCompletion
// Task #4: Canceled
// Task #6: Faulted
// NotSupportedException: Specified method is not supported.
// Task #7: Canceled
// Task #15: RanToCompletion
// Task #9: Canceled
// Task #11: Faulted
// NotSupportedException: Specified method is not supported.
// Task #12: Canceled
open System
open System.Threading
open System.Threading.Tasks
// Create a cancellation token and cancel it.
let source1 = new CancellationTokenSource()
let token1 = source1.Token
source1.Cancel()
// Create a cancellation token for later cancellation.
let source2 = new CancellationTokenSource()
let token2 = source2.Token
// Create a series of tasks that will complete, be cancelled,
// timeout, or throw an exception.
let tasks =
[| for i in 0..11 do
match i % 4 with
// Task should run to completion.
| 0 -> Task.Run(fun () -> Thread.Sleep 2000)
// Task should be set to canceled state.
| 1 -> Task.Run(fun () -> Thread.Sleep 2000, token1)
// Task should throw an exception.
| 2 -> Task.Run(fun () -> NotSupportedException())
// Task should examine cancellation token.
| _ ->
Task.Run(fun () ->
Thread.Sleep 2000
if token2.IsCancellationRequested then
token2.ThrowIfCancellationRequested()
Thread.Sleep 500, token2) |]
Thread.Sleep 250
source2.Cancel()
try
Task.WaitAll tasks
with :? AggregateException as ae ->
printfn "One or more exceptions occurred:"
for ex in ae.InnerExceptions do
printfn $" {ex.GetType().Name}: {ex.Message}"
printfn "\nStatus of tasks:"
for t in tasks do
printfn $" Task #{t.Id}: {t.Status}"
if isNull t.Exception |> not then
for ex in t.Exception.InnerExceptions do
printfn $" {ex.GetType().Name}: {ex.Message}"
// The example displays output like the following:
// One or more exceptions occurred:
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
//
// Status of tasks:
// Task #13: RanToCompletion
// Task #1: Canceled
// Task #3: Faulted
// NotSupportedException: Specified method is not supported.
// Task #8: Canceled
// Task #14: RanToCompletion
// Task #4: Canceled
// Task #6: Faulted
// NotSupportedException: Specified method is not supported.
// Task #7: Canceled
// Task #15: RanToCompletion
// Task #9: Canceled
// Task #11: Faulted
// NotSupportedException: Specified method is not supported.
// Task #12: Canceled
Imports System.Threading
Imports System.Threading.Tasks
Module Example7
Public Sub Main()
' Create a cancellation token and cancel it.
Dim source1 As New CancellationTokenSource()
Dim token1 As CancellationToken = source1.Token
source1.Cancel()
' Create a cancellation token for later cancellation.
Dim source2 As New CancellationTokenSource()
Dim token2 As CancellationToken = source2.Token
' Create a series of tasks that will complete, be cancelled,
' timeout, or throw an exception.
Dim tasks(11) As Task
For i As Integer = 0 To 11
Select Case i Mod 4
' Task should run to completion.
Case 0
tasks(i) = Task.Run(Sub() Thread.Sleep(2000))
' Task should be set to canceled state.
Case 1
tasks(i) = Task.Run(Sub() Thread.Sleep(2000), token1)
Case 2
' Task should throw an exception.
tasks(i) = Task.Run(Sub()
Throw New NotSupportedException()
End Sub)
Case 3
' Task should examine cancellation token.
tasks(i) = Task.Run(Sub()
Thread.Sleep(2000)
If token2.IsCancellationRequested Then
token2.ThrowIfCancellationRequested()
End If
Thread.Sleep(500)
End Sub, token2)
End Select
Next
Thread.Sleep(250)
source2.Cancel()
Try
Task.WaitAll(tasks)
Catch ae As AggregateException
Console.WriteLine("One or more exceptions occurred:")
For Each ex In ae.InnerExceptions
Console.WriteLine(" {0}: {1}", ex.GetType().Name, ex.Message)
Next
End Try
Console.WriteLine()
Console.WriteLine("Status of tasks:")
For Each t In tasks
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status)
If t.Exception IsNot Nothing Then
For Each ex In t.Exception.InnerExceptions
Console.WriteLine(" {0}: {1}", ex.GetType().Name,
ex.Message)
Next
End If
Next
End Sub
End Module
' The example displays output like the following:
' One or more exceptions occurred:
' TaskCanceledException: A task was canceled.
' NotSupportedException: Specified method is not supported.
' TaskCanceledException: A task was canceled.
' TaskCanceledException: A task was canceled.
' NotSupportedException: Specified method is not supported.
' TaskCanceledException: A task was canceled.
' TaskCanceledException: A task was canceled.
' NotSupportedException: Specified method is not supported.
' TaskCanceledException: A task was canceled.
'
' Status of tasks:
' Task #13: RanToCompletion
' Task #1: Canceled
' Task #3: Faulted
' NotSupportedException: Specified method is not supported.
' Task #8: Canceled
' Task #14: RanToCompletion
' Task #4: Canceled
' Task #6: Faulted
' NotSupportedException: Specified method is not supported.
' Task #7: Canceled
' Task #15: RanToCompletion
' Task #9: Canceled
' Task #11: Faulted
' NotSupportedException: Specified method is not supported.
' Task #12: Canceled
Para obtener más información sobre el control de excepciones en operaciones asincrónicas basadas en tareas, vea Control de excepciones.
Tareas y cultura
A partir de aplicaciones de escritorio destinadas a .NET Framework 4.6, la referencia cultural del subproceso que crea e invoca una tarea forma parte del contexto del subproceso. Es decir, independientemente de la referencia cultural actual del subproceso en el que se ejecuta la tarea, la referencia cultural actual de la tarea es la referencia cultural del subproceso que realiza la llamada. En el caso de las aplicaciones destinadas a versiones de .NET Framework anteriores a .NET Framework 4.6, la referencia cultural de la tarea es la referencia cultural del subproceso en el que se ejecuta la tarea. Para obtener más información, consulte la sección "Cultura y operaciones asincrónicas basadas en tareas" en el tema CultureInfo.
Note
Las aplicaciones de la Tienda utilizan Windows Runtime para establecer y obtener la referencia cultural predeterminada.
Para desarrolladores de depuradores
Para los desarrolladores que implementan depuradores personalizados, varios miembros internos y privados de la tarea pueden ser útiles (pueden cambiar de versión a versión). El campo m_taskId actúa como almacén de respaldo para la propiedad Id, pero acceder a este campo directamente desde un depurador puede ser más eficaz que acceder al mismo valor a través del método getter de la propiedad (el contador s_taskIdCounter se usa para recuperar el siguiente identificador disponible para una tarea). Del mismo modo, el m_stateFlags campo almacena información sobre la fase actual del ciclo de vida de la tarea, la información también es accesible a través de la Status propiedad . El m_action campo almacena una referencia al delegado de la tarea y el m_stateObject campo almacena el estado asincrónico pasado a la tarea por el desarrollador. Por último, para los depuradores que analizan marcos de pila, el método InternalWait sirve como un marcador potencial cuando una tarea está entrando en una operación de espera.
Constructores
| Nombre | Description |
|---|---|
| Task(Action, CancellationToken, TaskCreationOptions) |
Inicializa un nuevo Task con las opciones de acción y creación especificadas. |
| Task(Action, CancellationToken) |
Inicializa un nuevo Task con la acción especificada y CancellationToken. |
| Task(Action, TaskCreationOptions) |
Inicializa un nuevo Task con las opciones de acción y creación especificadas. |
| Task(Action) |
Inicializa un nuevo Task con la acción especificada. |
| Task(Action<Object>, Object, CancellationToken, TaskCreationOptions) |
Inicializa un nuevo Task con la acción, el estado y las opciones especificados. |
| Task(Action<Object>, Object, CancellationToken) |
Inicializa un nuevo Task con la acción, el estado y CancellationTokenespecificados. |
| Task(Action<Object>, Object, TaskCreationOptions) |
Inicializa un nuevo Task con la acción, el estado y las opciones especificados. |
| Task(Action<Object>, Object) |
Inicializa un nuevo Task con la acción y el estado especificados. |
Propiedades
| Nombre | Description |
|---|---|
| AsyncState |
Obtiene el objeto de estado proporcionado cuando Task se creó o null si no se proporcionó ninguno. |
| CompletedTask |
Obtiene una tarea que ya se ha completado correctamente. |
| CreationOptions |
Obtiene el TaskCreationOptions objeto utilizado para crear esta tarea. |
| CurrentId |
Devuelve el identificador del objeto que se está Taskejecutando actualmente. |
| Exception |
Obtiene el AggregateException objeto que provocó que finalizara Task prematuramente. Si se Task completó correctamente o aún no ha producido ninguna excepción, devolverá |
| Factory |
Proporciona acceso a los métodos de fábrica para crear y configurar Task instancias y Task<TResult> . |
| Id |
Obtiene un identificador para esta Task instancia. |
| IsCanceled |
Obtiene si esta Task instancia ha completado la ejecución debido a la cancelación. |
| IsCompleted |
Obtiene un valor que indica si la tarea se ha completado. |
| IsCompletedSuccessfully |
Obtiene si la tarea se ejecutó hasta la finalización. |
| IsFaulted |
Obtiene si se Task completó debido a una excepción no controlada. |
| Status |
Obtiene el TaskStatus de esta tarea. |
Métodos
| Nombre | Description |
|---|---|
| ConfigureAwait(Boolean) |
Configura un awaiter que se usa para esperar a este Task. |
| ConfigureAwait(ConfigureAwaitOptions) |
Configura un awaiter que se usa para esperar a este Task. |
| ContinueWith(Action<Task,Object>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Crea una continuación que recibe información de estado proporcionada por el autor de la llamada y un token de cancelación y que se ejecuta cuando se completa el destino Task . La continuación se ejecuta en función de un conjunto de condiciones especificadas y usa un programador especificado. |
| ContinueWith(Action<Task,Object>, Object, CancellationToken) |
Crea una continuación que recibe información de estado proporcionada por el autor de la llamada y un token de cancelación y que se ejecuta de forma asincrónica cuando se completa el destino Task . |
| ContinueWith(Action<Task,Object>, Object, TaskContinuationOptions) |
Crea una continuación que recibe información de estado proporcionada por el autor de la llamada y se ejecuta cuando se completa el destino Task . La continuación se ejecuta en función de un conjunto de condiciones especificadas. |
| ContinueWith(Action<Task,Object>, Object, TaskScheduler) |
Crea una continuación que recibe información de estado proporcionada por el autor de la llamada y se ejecuta de forma asincrónica cuando se completa el destino Task . La continuación usa un programador especificado. |
| ContinueWith(Action<Task,Object>, Object) |
Crea una continuación que recibe información de estado proporcionada por el autor de la llamada y se ejecuta cuando se completa el destino Task . |
| ContinueWith(Action<Task>, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Crea una continuación que se ejecuta cuando la tarea de destino compite según el especificado TaskContinuationOptions. La continuación recibe un token de cancelación y usa un programador especificado. |
| ContinueWith(Action<Task>, CancellationToken) |
Crea una continuación que recibe un token de cancelación y se ejecuta de forma asincrónica cuando se completa el destino Task . |
| ContinueWith(Action<Task>, TaskContinuationOptions) |
Crea una continuación que se ejecuta cuando se completa la tarea de destino según el especificado TaskContinuationOptions. |
| ContinueWith(Action<Task>, TaskScheduler) |
Crea una continuación que se ejecuta de forma asincrónica cuando se completa el destino Task . La continuación usa un programador especificado. |
| ContinueWith(Action<Task>) |
Crea una continuación que se ejecuta de forma asincrónica cuando se completa el destino Task . |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Crea una continuación que se ejecuta en función de las opciones de continuación de tareas especificadas cuando el destino Task finaliza y devuelve un valor. La continuación recibe información de estado proporcionada por el autor de la llamada y un token de cancelación y usa el programador especificado. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken) |
Crea una continuación que se ejecuta de forma asincrónica cuando el destino Task finaliza y devuelve un valor. La continuación recibe información de estado proporcionada por el autor de la llamada y un token de cancelación. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskContinuationOptions) |
Crea una continuación que se ejecuta en función de las opciones de continuación de tareas especificadas cuando se completa el destino Task . La continuación recibe información de estado proporcionada por el autor de la llamada. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskScheduler) |
Crea una continuación que se ejecuta de forma asincrónica cuando se completa el destino Task . La continuación recibe información de estado proporcionada por el autor de la llamada y usa un programador especificado. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object) |
Crea una continuación que recibe información de estado proporcionada por el autor de la llamada y se ejecuta de forma asincrónica cuando el destino Task finaliza y devuelve un valor. |
| ContinueWith<TResult>(Func<Task,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Crea una continuación que se ejecuta según las opciones de continuación especificadas y devuelve un valor. La continuación se pasa un token de cancelación y usa un programador especificado. |
| ContinueWith<TResult>(Func<Task,TResult>, CancellationToken) |
Crea una continuación que se ejecuta de forma asincrónica cuando el destino Task finaliza y devuelve un valor. La continuación recibe un token de cancelación. |
| ContinueWith<TResult>(Func<Task,TResult>, TaskContinuationOptions) |
Crea una continuación que se ejecuta según las opciones de continuación especificadas y devuelve un valor. |
| ContinueWith<TResult>(Func<Task,TResult>, TaskScheduler) |
Crea una continuación que se ejecuta de forma asincrónica cuando el destino Task finaliza y devuelve un valor. La continuación usa un programador especificado. |
| ContinueWith<TResult>(Func<Task,TResult>) |
Crea una continuación que se ejecuta de forma asincrónica cuando el destino Task<TResult> finaliza y devuelve un valor. |
| Delay(Int32, CancellationToken) |
Crea una tarea cancelable que se completa después de un número especificado de milisegundos. |
| Delay(Int32) |
Crea una tarea que se completa después de un número especificado de milisegundos. |
| Delay(TimeSpan, CancellationToken) |
Crea una tarea cancelable que se completa después de un intervalo de tiempo especificado. |
| Delay(TimeSpan, TimeProvider, CancellationToken) |
Crea una tarea cancelable que se completa después de un intervalo de tiempo especificado. |
| Delay(TimeSpan, TimeProvider) |
Crea una tarea que se completa después de un intervalo de tiempo especificado. |
| Delay(TimeSpan) |
Crea una tarea que se completa después de un intervalo de tiempo especificado. |
| Dispose() |
Libera todos los recursos usados por la instancia actual de la Task clase . |
| Dispose(Boolean) |
Elimina , Taskliberando todos sus recursos no administrados. |
| Equals(Object) |
Determina si el objeto especificado es igual al objeto actual. (Heredado de Object) |
| FromCanceled(CancellationToken) |
Crea un objeto Task completado debido a la cancelación con un token de cancelación especificado. |
| FromCanceled<TResult>(CancellationToken) |
Crea un objeto Task<TResult> completado debido a la cancelación con un token de cancelación especificado. |
| FromException(Exception) |
Crea un objeto Task que se ha completado con una excepción especificada. |
| FromException<TResult>(Exception) |
Crea un objeto Task<TResult> que se completa con una excepción especificada. |
| FromResult<TResult>(TResult) |
Crea un objeto Task<TResult> que se completa correctamente con el resultado especificado. |
| GetAwaiter() |
Obtiene un awaiter usado para esperar a este Taskobjeto . |
| GetHashCode() |
Actúa como función hash predeterminada. (Heredado de Object) |
| GetType() |
Obtiene el Type de la instancia actual. (Heredado de Object) |
| MemberwiseClone() |
Crea una copia superficial del Objectactual. (Heredado de Object) |
| Run(Action, CancellationToken) |
Pone en cola el trabajo especificado para ejecutarse en el grupo de subprocesos y devuelve un Task objeto que representa ese trabajo. Un token de cancelación permite cancelar el trabajo si aún no se ha iniciado. |
| Run(Action) |
Pone en cola el trabajo especificado para ejecutarse en el grupo de subprocesos y devuelve un Task objeto que representa ese trabajo. |
| Run(Func<Task>, CancellationToken) |
Pone en cola el trabajo especificado para ejecutarse en el grupo de subprocesos y devuelve un proxy para la tarea devuelta por |
| Run(Func<Task>) |
Pone en cola el trabajo especificado para ejecutarse en el grupo de subprocesos y devuelve un proxy para la tarea devuelta por |
| Run<TResult>(Func<Task<TResult>>, CancellationToken) |
Pone en cola el trabajo especificado para ejecutarse en el grupo de subprocesos y devuelve un proxy para el |
| Run<TResult>(Func<Task<TResult>>) |
Pone en cola el trabajo especificado para ejecutarse en el grupo de subprocesos y devuelve un proxy para el |
| Run<TResult>(Func<TResult>, CancellationToken) |
Pone en cola el trabajo especificado para ejecutarse en el grupo de subprocesos y devuelve un |
| Run<TResult>(Func<TResult>) |
Pone en cola el trabajo especificado para ejecutarse en el grupo de subprocesos y devuelve un Task<TResult> objeto que representa ese trabajo. Un token de cancelación permite cancelar el trabajo si aún no se ha iniciado. |
| RunSynchronously() |
Ejecuta de Task forma sincrónica en el objeto actual TaskScheduler. |
| RunSynchronously(TaskScheduler) |
Ejecuta la Task sincrónicamente en el TaskScheduler proporcionado. |
| Start() |
Inicia , Tasklo programa para su ejecución en el objeto actual TaskScheduler. |
| Start(TaskScheduler) |
Inicia , Tasklo programa para su ejecución en el especificado TaskScheduler. |
| ToString() |
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |
| Wait() |
Espera a que se complete la Task ejecución. |
| Wait(CancellationToken) |
Espera a que se complete la Task ejecución. La espera finaliza si se cancela un token de cancelación antes de que se complete la tarea. |
| Wait(Int32, CancellationToken) |
Espera a que se complete la Task ejecución. La espera finaliza si transcurre un intervalo de tiempo de espera o se cancela un token de cancelación antes de que se complete la tarea. |
| Wait(Int32) |
Espera a que se complete la Task ejecución dentro de un número especificado de milisegundos. |
| Wait(TimeSpan, CancellationToken) |
Espera a que se complete la Task ejecución. |
| Wait(TimeSpan) |
Espera a que se complete la Task ejecución dentro de un intervalo de tiempo especificado. |
| WaitAll(IEnumerable<Task>, CancellationToken) |
Espera a que todos los objetos proporcionados Task completen la ejecución a menos que se cancele la espera. |
| WaitAll(ReadOnlySpan<Task>) |
Espera a que todos los objetos proporcionados Task completen la ejecución. |
| WaitAll(Task[], CancellationToken) |
Espera a que todos los objetos proporcionados Task completen la ejecución a menos que se cancele la espera. |
| WaitAll(Task[], Int32, CancellationToken) |
Espera a que todos los objetos proporcionados Task completen la ejecución dentro de un número especificado de milisegundos o hasta que se cancele la espera. |
| WaitAll(Task[], Int32) |
Espera a que todos los objetos proporcionados Task completen la ejecución dentro de un número especificado de milisegundos. |
| WaitAll(Task[], TimeSpan) |
Espera a que todos los objetos cancelables Task proporcionados completen la ejecución dentro de un intervalo de tiempo especificado. |
| WaitAll(Task[]) |
Espera a que todos los objetos proporcionados Task completen la ejecución. |
| WaitAny(Task[], CancellationToken) |
Espera a que cualquiera de los objetos proporcionados Task complete la ejecución a menos que se cancele la espera. |
| WaitAny(Task[], Int32, CancellationToken) |
Espera a que cualquiera de los objetos proporcionados Task complete la ejecución dentro de un número especificado de milisegundos o hasta que se cancele un token de cancelación. |
| WaitAny(Task[], Int32) |
Espera a que cualquiera de los objetos proporcionados Task complete la ejecución dentro de un número especificado de milisegundos. |
| WaitAny(Task[], TimeSpan) |
Espera a que cualquiera de los objetos proporcionados Task complete la ejecución dentro de un intervalo de tiempo especificado. |
| WaitAny(Task[]) |
Espera a que cualquiera de los objetos proporcionados Task complete la ejecución. |
| WaitAsync(CancellationToken) |
Obtiene un objeto Task que se completará cuando se Task complete o cuando se haya solicitado la cancelación especificada CancellationToken . |
| WaitAsync(TimeSpan, CancellationToken) |
Obtiene un Task objeto que se completará cuando Task finalice, cuando expire el tiempo de espera especificado o cuando se haya solicitado la cancelación especificada CancellationToken . |
| WaitAsync(TimeSpan, TimeProvider, CancellationToken) |
Obtiene un Task objeto que se completará cuando Task finalice, cuando expire el tiempo de espera especificado o cuando se haya solicitado la cancelación especificada CancellationToken . |
| WaitAsync(TimeSpan, TimeProvider) |
Obtiene un Task objeto que se completará cuando Task finalice o cuando expire el tiempo de espera especificado. |
| WaitAsync(TimeSpan) |
Obtiene un Task objeto que se completará cuando Task finalice o cuando expire el tiempo de espera especificado. |
| WhenAll(IEnumerable<Task>) |
Crea una tarea que se completará cuando se hayan completado todos los Task objetos de una colección enumerable. |
| WhenAll(ReadOnlySpan<Task>) |
Crea una tarea que se completará cuando se hayan completado todas las tareas proporcionadas. |
| WhenAll(Task[]) |
Crea una tarea que se completará cuando se hayan completado todos los Task objetos de una matriz. |
| WhenAll<TResult>(IEnumerable<Task<TResult>>) |
Crea una tarea que se completará cuando se hayan completado todos los Task<TResult> objetos de una colección enumerable. |
| WhenAll<TResult>(ReadOnlySpan<Task<TResult>>) |
Crea una tarea que se completará cuando se hayan completado todas las tareas proporcionadas. |
| WhenAll<TResult>(Task<TResult>[]) |
Crea una tarea que se completará cuando se hayan completado todos los Task<TResult> objetos de una matriz. |
| WhenAny(IEnumerable<Task>) |
Crea una tarea que se completará cuando se haya completado cualquiera de las tareas proporcionadas. |
| WhenAny(ReadOnlySpan<Task>) |
Crea una tarea que se completará cuando se haya completado cualquiera de las tareas proporcionadas. |
| WhenAny(Task, Task) |
Crea una tarea que se completará cuando se haya completado alguna de las tareas proporcionadas. |
| WhenAny(Task[]) |
Crea una tarea que se completará cuando se haya completado cualquiera de las tareas proporcionadas. |
| WhenAny<TResult>(IEnumerable<Task<TResult>>) |
Crea una tarea que se completará cuando se haya completado cualquiera de las tareas proporcionadas. |
| WhenAny<TResult>(ReadOnlySpan<Task<TResult>>) |
Crea una tarea que se completará cuando se haya completado cualquiera de las tareas proporcionadas. |
| WhenAny<TResult>(Task<TResult>, Task<TResult>) |
Crea una tarea que se completará cuando se haya completado alguna de las tareas proporcionadas. |
| WhenAny<TResult>(Task<TResult>[]) |
Crea una tarea que se completará cuando se haya completado cualquiera de las tareas proporcionadas. |
| WhenEach(IEnumerable<Task>) |
Crea un objeto IAsyncEnumerable<T> que producirá las tareas proporcionadas a medida que se completen esas tareas. |
| WhenEach(ReadOnlySpan<Task>) |
Crea un objeto IAsyncEnumerable<T> que producirá las tareas proporcionadas a medida que se completen esas tareas. |
| WhenEach(Task[]) |
Crea un objeto IAsyncEnumerable<T> que producirá las tareas proporcionadas a medida que se completen esas tareas. |
| WhenEach<TResult>(IEnumerable<Task<TResult>>) |
Crea un objeto IAsyncEnumerable<T> que producirá las tareas proporcionadas a medida que se completen esas tareas. |
| WhenEach<TResult>(ReadOnlySpan<Task<TResult>>) |
Crea un objeto IAsyncEnumerable<T> que producirá las tareas proporcionadas a medida que se completen esas tareas. |
| WhenEach<TResult>(Task<TResult>[]) |
Crea un objeto IAsyncEnumerable<T> que producirá las tareas proporcionadas a medida que se completen esas tareas. |
| Yield() |
Crea una tarea a la espera que se devuelve de forma asincrónica al contexto actual cuando se espera. |
Implementaciones de interfaz explícitas
| Nombre | Description |
|---|---|
| IAsyncResult.AsyncWaitHandle |
Obtiene un WaitHandle objeto que se puede usar para esperar a que se complete la tarea. |
| IAsyncResult.CompletedSynchronously |
Obtiene una indicación de si la operación se completó sincrónicamente. |
Métodos de extensión
| Nombre | Description |
|---|---|
| AsAsyncAction(Task) |
Devuelve una acción asincrónica de Windows Runtime que representa una tarea iniciada. |
| DispatcherOperationWait(Task, TimeSpan) |
Espera la cantidad de tiempo especificada para que se complete el subyacente DispatcherOperation . |
| DispatcherOperationWait(Task) |
Espera indefinidamente a que se complete el subyacente DispatcherOperation . |
| IsDispatcherOperationTask(Task) |
Devuelve un valor que indica si está Task asociado a .DispatcherOperation |
Se aplica a
Seguridad para subprocesos
Todos los miembros de Task, excepto , son seguros para Dispose()subprocesos y se pueden usar de varios subprocesos simultáneamente.