Task Classe

Definição

Representa uma operação assíncrona.

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
Herança
Task
Derivado
Implementações

Observações

A Task classe representa uma única operação que não retorna um valor e que geralmente é executada de forma assíncrona. Task Os objetos são um dos componentes centrais do padrão assíncrono baseado em tarefas. Como o trabalho executado por um Task objeto normalmente é executado assincronamente numa thread do pool de threads em vez de sincronamente na thread principal da aplicação, é possível usar a propriedade Status, bem como as propriedades IsCanceled, IsCompleted e IsFaulted para determinar o estado de uma tarefa. Mais comumente, uma expressão lambda é usada para especificar o trabalho que a tarefa deve executar.

Para operações que retornam valores, use a Task<TResult> classe.

Instanciação de tarefas

O exemplo a seguir cria e executa quatro tarefas. Três tarefas executam um Action<T> delegado chamado action, que aceita um argumento do tipo Object. Uma quarta tarefa executa uma expressão lambda (um Action delegado) que é definida inline na chamada para o método de criação de tarefa. Cada tarefa é instanciada e executada de uma maneira diferente:

  • A tarefa t1 é instanciada ao chamar um construtor da classe Task, mas é iniciada chamando o seu método Start() somente depois de a tarefa t2 estar iniciada.

  • A tarefa t2 é instanciada e iniciada em uma única chamada de método chamando o TaskFactory.StartNew(Action<Object>, Object) método.

  • A tarefa t3 é instanciada e iniciada em uma única chamada de método chamando o Run(Action) método.

  • A tarefa t4 é executada de forma síncrona no thread principal chamando o RunSynchronously() método.

Como a tarefa t4 é executada de forma síncrona, ela é executada no thread principal do aplicativo. Normalmente, as tarefas restantes são executadas de forma assíncrona em um ou mais threads de um pool de threads.

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

Criar e executar uma tarefa

Você pode criar Task instâncias de várias maneiras. A abordagem mais comum é chamar o método estático Run . O Run método fornece uma maneira simples de iniciar uma tarefa usando valores padrão e sem exigir parâmetros adicionais. O exemplo a seguir usa o Run(Action) método para iniciar uma tarefa que faz loops e, em seguida, exibe o número de iterações de loop:

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

Uma alternativa é o método estático TaskFactory.StartNew . A Task.Factory propriedade retorna um TaskFactory objeto. As sobrecargas do método TaskFactory.StartNew permitem especificar parâmetros para passar para as opções de criação de tarefas e um agendador de tarefas. O exemplo a seguir usa o TaskFactory.StartNew método para iniciar uma tarefa. É funcionalmente equivalente ao código no exemplo 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 obter exemplos mais completos, consulte Programação assíncrona baseada em tarefas.

Criação e execução de tarefas separadas

A Task classe também fornece construtores que inicializam a tarefa, mas que não a agendam para execução. Por motivos de desempenho, o método Task.Run ou o método TaskFactory.StartNew são os mecanismos preferidos para criar e agendar tarefas computacionais, mas para cenários em que a criação e o agendamento devem ser separados, pode-se usar os construtores e, em seguida, chamar o método Task.Start para agendar a tarefa para execução em um momento posterior.

Aguarde a conclusão de uma tarefa

Como as tarefas normalmente são executadas de forma assíncrona em um thread do pool de threads, o thread que cria e inicia a tarefa continua a execução assim que a tarefa é instanciada. Em alguns casos, quando o thread de chamada é o thread principal do aplicativo, o aplicativo pode ser encerrado antes que a tarefa realmente comece a ser executada. Em outros, a lógica do aplicativo pode exigir que o thread de chamada continue a execução somente quando uma ou mais tarefas tiverem concluído a execução. Você pode sincronizar a execução do thread de chamada e as tarefas assíncronas iniciadas chamando um Wait método para aguardar a conclusão de uma ou mais tarefas.

Para aguardar a conclusão de uma única tarefa, você pode chamar seu Task.Wait método. Uma chamada para o Wait método bloqueia o thread de chamada até que a instância de classe única tenha concluído a execução.

O exemplo a seguir chama o método parameterless Wait() para aguardar incondicionalmente até que uma tarefa seja concluída. A tarefa simula o trabalho chamando o Thread.Sleep método para dormir por dois 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

Você também pode aguardar condicionalmente a conclusão de uma tarefa. Os métodos Wait(Int32) e Wait(TimeSpan) bloqueiam o thread que faz a chamada até que a tarefa termine ou o tempo limite seja alcançado, o que ocorrer primeiro. Como o exemplo a seguir inicia uma tarefa que permanece suspensa por dois segundos, mas define um valor de tempo limite de um segundo, o thread de chamada bloqueia até que o tempo limite expire e antes que a tarefa tenha concluído a execução.

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.

Você também pode fornecer um token de cancelamento chamando os métodos Wait(CancellationToken) e Wait(Int32, CancellationToken). Se a propriedade do token IsCancellationRequested for true ou se tornar true enquanto o método Wait estiver em execução, o método lançará um OperationCanceledException.

Em alguns casos, você pode querer esperar que a primeira de uma série de tarefas em execução seja concluída, mas não se importa com qual tarefa é. Para isso, você pode chamar uma das sobrecargas do Task.WaitAny método. O exemplo a seguir cria três tarefas, cada uma das quais permanece suspensa por um intervalo determinado por um gerador de números aleatórios. O WaitAny(Task[]) método aguarda a conclusão da primeira tarefa. O exemplo exibe informações sobre o status das três tarefas.

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

Você também pode aguardar a conclusão de uma série de tarefas chamando o WaitAll método. O exemplo a seguir cria dez tarefas, aguarda a conclusão de todas as dez e exibe seu status.

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

Observe que quando você aguarda a conclusão de uma ou mais tarefas, todas as exceções lançadas nas tarefas em execução são propagadas no thread que chama o Wait método, como mostra o exemplo a seguir. Ele lança 12 tarefas, três delas são concluídas normalmente e três geram uma exceção. Das seis tarefas restantes, três são canceladas antes de começarem e três são canceladas durante a execução. As exceções são lançadas na chamada do método WaitAll e são tratadas por um bloco 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 obter mais informações sobre o tratamento de exceções em operações assíncronas baseadas em tarefas, consulte Tratamento de exceções.

Tarefas e cultura

Começando com aplicações de desktop que têm como alvo o .NET Framework 4.6, a cultura do thread que cria e invoca uma tarefa torna-se parte integrante do contexto do thread. Ou seja, independentemente da cultura atual do thread no qual a tarefa é executada, a cultura atual da tarefa é a cultura do thread chamador. Para aplicativos destinados a versões do .NET Framework anteriores ao .NET Framework 4.6, a cultura da tarefa é a cultura do thread no qual a tarefa é executada. Para obter mais informações, consulte a seção "Cultura e operações assíncronas baseadas em tarefas" no CultureInfo tópico .

Note

Os aplicativos da Store seguem o Tempo de Execução do Windows na configuração e obtenção da cultura padrão.

Para desenvolvedores de depuradores

Para desenvolvedores que implementam depuradores personalizados, vários membros internos e privados da tarefa podem ser úteis (estes podem mudar de versão para versão). O m_taskId campo serve como armazenamento de suporte para a Id propriedade, no entanto, acessar esse campo diretamente de um depurador pode ser mais eficiente do que acessar o mesmo valor por meio do método getter da propriedade (o s_taskIdCounter contador é usado para recuperar a próxima ID disponível para uma tarefa). Da mesma forma, o campo m_stateFlags armazena informações sobre o estágio atual do ciclo de vida da tarefa, estas também acessíveis através da propriedade Status. O m_action campo armazena uma referência ao delegado da tarefa e o campo armazena m_stateObject o estado assíncrono passado para a tarefa pelo desenvolvedor. Finalmente, para depuradores que analisam quadros de pilha, o InternalWait método serve como um marcador potencial para quando uma tarefa está entrando em uma operação de espera.

Construtores

Name Descrição
Task(Action, CancellationToken, TaskCreationOptions)

Inicializa um novo Task com as opções de ação e criação especificadas.

Task(Action, CancellationToken)

Inicializa um novo Task com a ação especificada e CancellationToken.

Task(Action, TaskCreationOptions)

Inicializa um novo Task com as opções de ação e criação especificadas.

Task(Action)

Inicializa um novo Task com a ação especificada.

Task(Action<Object>, Object, CancellationToken, TaskCreationOptions)

Inicializa um novo Task com a ação, estado e opções especificados.

Task(Action<Object>, Object, CancellationToken)

Inicializa um novo Task com a ação, estado e CancellationToken. especificados.

Task(Action<Object>, Object, TaskCreationOptions)

Inicializa um novo Task com a ação, estado e opções especificados.

Task(Action<Object>, Object)

Inicializa um novo Task com a ação e o estado especificados.

Propriedades

Name Descrição
AsyncState

Recebe o objeto de estado fornecido quando foi criado Task , ou nulo se não tiver sido fornecido.

CompletedTask

Recebe uma tarefa que já foi concluída com sucesso.

CreationOptions

É o TaskCreationOptions que se usa para criar esta tarefa.

CurrentId

Devolve o ID do que está a executar Taskatualmente .

Exception

Obtém o AggregateException que causou o Task fim prematuro. Se o Task completar com sucesso ou ainda não tiver lançado exceções, isto devolverá null.

Factory

Fornece acesso a métodos de fábrica para criar e configurar Task instâncias Task<TResult> .

Id

Obtém um ID para este Task caso.

IsCanceled

Percebe se esta Task instância concluiu a execução devido ao cancelamento.

IsCompleted

Recebe um valor que indica se a tarefa foi concluída.

IsCompletedSuccessfully

Percebe se a tarefa foi concluída.

IsFaulted

Obtém se o Task concluído devido a uma exceção não tratada.

Status

Percebe TaskStatus esta tarefa.

Métodos

Name Descrição
ConfigureAwait(Boolean)

Configura um awaiter usado para aguardar isto Task.

ConfigureAwait(ConfigureAwaitOptions)

Configura um awaiter usado para aguardar isto Task.

ContinueWith(Action<Task,Object>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler)

Cria uma continuação que recebe informação de estado fornecida pelo chamador e um token de cancelamento, que é executada quando o destino Task é concluído. A continuação é executada com base num conjunto de condições especificadas e utiliza um agendador especificado.

ContinueWith(Action<Task,Object>, Object, CancellationToken)

Cria uma continuação que recebe informação de estado fornecida pelo chamador e um token de cancelamento, e que é executada de forma assíncrona quando o destino Task termina.

ContinueWith(Action<Task,Object>, Object, TaskContinuationOptions)

Cria uma continuação que recebe informações de estado fornecidas pelo chamador e executa-se quando o destino Task termina. A continuação é executada com base num conjunto de condições especificadas.

ContinueWith(Action<Task,Object>, Object, TaskScheduler)

Cria uma continuação que recebe informação de estado fornecida pelo chamador e executa assíncrona quando o destino Task termina. A continuação utiliza um escalonador especificado.

ContinueWith(Action<Task,Object>, Object)

Cria uma continuação que recebe informações de estado fornecidas pelo chamador e executa-se quando o destino Task termina.

ContinueWith(Action<Task>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Cria uma continuação que se executa quando a tarefa-alvo compete de acordo com o especificado TaskContinuationOptions. A continuação recebe um token de cancelamento e utiliza um escalonador especificado.

ContinueWith(Action<Task>, CancellationToken)

Cria uma continuação que recebe um token de cancelamento e executa assíncronamente quando o destino Task é concluído.

ContinueWith(Action<Task>, TaskContinuationOptions)

Cria uma continuação que se executa quando a tarefa alvo é concluída de acordo com o especificado TaskContinuationOptions.

ContinueWith(Action<Task>, TaskScheduler)

Cria uma continuação que é executada assíncrona quando o destino Task termina. A continuação utiliza um escalonador especificado.

ContinueWith(Action<Task>)

Cria uma continuação que é executada assíncrona quando o destino Task termina.

ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler)

Cria uma continuação que é executada com base nas opções de continuação de tarefa especificadas quando o destino Task é concluído e devolve um valor. A continuação recebe informações de estado fornecidas pelo chamador e um token de cancelamento, utilizando o escalonador especificado.

ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken)

Cria uma continuação que se executa assíncrona quando o destino Task termina e devolve um valor. A continuação recebe informações de estado fornecidas pelo chamador e um token de cancelamento.

ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskContinuationOptions)

Cria uma continuação que é executada com base nas opções de continuação da tarefa especificadas quando o destino Task é concluído. A continuação recebe informações de estado fornecidas pelo chamador.

ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskScheduler)

Cria uma continuação que é executada assíncrona quando o destino Task termina. A continuação recebe informações de estado fornecidas pelo chamador e utiliza um agendador especificado.

ContinueWith<TResult>(Func<Task,Object,TResult>, Object)

Cria uma continuação que recebe informação de estado fornecida pelo chamador e executa assíncronamente quando o destino Task termina e devolve um valor.

ContinueWith<TResult>(Func<Task,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Cria uma continuação que se executa de acordo com as opções de continuação especificadas e devolve um valor. A continuação recebe um token de cancelamento e utiliza um escalonador especificado.

ContinueWith<TResult>(Func<Task,TResult>, CancellationToken)

Cria uma continuação que se executa assíncrona quando o destino Task termina e devolve um valor. A continuação recebe um token de cancelamento.

ContinueWith<TResult>(Func<Task,TResult>, TaskContinuationOptions)

Cria uma continuação que se executa de acordo com as opções de continuação especificadas e devolve um valor.

ContinueWith<TResult>(Func<Task,TResult>, TaskScheduler)

Cria uma continuação que se executa assíncrona quando o destino Task termina e devolve um valor. A continuação utiliza um escalonador especificado.

ContinueWith<TResult>(Func<Task,TResult>)

Cria uma continuação que se executa assíncrona quando o destino Task<TResult> termina e devolve um valor.

Delay(Int32, CancellationToken)

Cria uma tarefa cancelável que se completa após um número especificado de milissegundos.

Delay(Int32)

Cria uma tarefa que se completa após um número especificado de milissegundos.

Delay(TimeSpan, CancellationToken)

Cria uma tarefa cancelável que é concluída após um intervalo de tempo especificado.

Delay(TimeSpan, TimeProvider, CancellationToken)

Cria uma tarefa cancelável que é concluída após um intervalo de tempo especificado.

Delay(TimeSpan, TimeProvider)

Cria uma tarefa que é concluída após um intervalo de tempo especificado.

Delay(TimeSpan)

Cria uma tarefa que é concluída após um intervalo de tempo especificado.

Dispose()

Liberta todos os recursos usados pela instância atual da Task classe.

Dispose(Boolean)

Elimina o Task, libertando todos os seus recursos não geridos.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
FromCanceled(CancellationToken)

Cria um Task que é concluído devido ao cancelamento com um token de cancelamento especificado.

FromCanceled<TResult>(CancellationToken)

Cria um Task<TResult> que é concluído devido ao cancelamento com um token de cancelamento especificado.

FromException(Exception)

Cria um Task que terminou com uma exceção especificada.

FromException<TResult>(Exception)

Cria um Task<TResult> que é concluído com uma exceção especificada.

FromResult<TResult>(TResult)

Cria um Task<TResult> que é concluído com sucesso com o resultado especificado.

GetAwaiter()

Acostuma um empregado para esperar por isto Task.

GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
Run(Action, CancellationToken)

Coloca o trabalho especificado para executar no pool de threads e devolve um Task objeto que representa esse trabalho. Um token de cancelamento permite que a obra seja cancelada se ainda não tiver começado.

Run(Action)

Coloca o trabalho especificado para executar no pool de threads e devolve um Task objeto que representa esse trabalho.

Run(Func<Task>, CancellationToken)

Coloca o trabalho especificado na fila para executar no pool de threads e retorna um proxy para a tarefa devolvida por function. Um token de cancelamento permite que a obra seja cancelada se ainda não tiver começado.

Run(Func<Task>)

Coloca o trabalho especificado na fila para executar no pool de threads e retorna um proxy para a tarefa devolvida por function.

Run<TResult>(Func<Task<TResult>>, CancellationToken)

Coloca o trabalho especificado na fila para correr no pool de threads e retorna um proxy para o Task(TResult) devolvido por function.

Run<TResult>(Func<Task<TResult>>)

Coloca o trabalho especificado na fila para correr no pool de threads e retorna um proxy para o Task(TResult) devolvido por function. Um token de cancelamento permite que a obra seja cancelada se ainda não tiver começado.

Run<TResult>(Func<TResult>, CancellationToken)

Coloca o trabalho especificado para executar no pool de threads e devolve um Task(TResult) objeto que representa esse trabalho.

Run<TResult>(Func<TResult>)

Coloca o trabalho especificado para executar no pool de threads e devolve um Task<TResult> objeto que representa esse trabalho. Um token de cancelamento permite que a obra seja cancelada se ainda não tiver começado.

RunSynchronously()

Executa sincronizadamente Task com a corrente TaskScheduler.

RunSynchronously(TaskScheduler)

Executa o Task sistema síncronicamente no TaskScheduler fornecido.

Start()

Inicia o Task, agendando-o para execução para o atual TaskScheduler.

Start(TaskScheduler)

Inicia o Task, agendando-o para execução ao especificado TaskScheduler.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)
Wait()

Espera que a Task execução seja concluída.

Wait(CancellationToken)

Espera que a Task execução seja concluída. A espera termina se um token de cancelamento for cancelado antes da tarefa concluir.

Wait(Int32, CancellationToken)

Espera que a Task execução seja concluída. A espera termina se passar um intervalo de tempo ou se um token de cancelamento for cancelado antes da tarefa ser concluída.

Wait(Int32)

Espera que a Task execução seja concluída dentro de um número especificado de milissegundos.

Wait(TimeSpan, CancellationToken)

Espera que a Task execução seja concluída.

Wait(TimeSpan)

Espera que a Task execução seja concluída dentro de um intervalo de tempo especificado.

WaitAll(IEnumerable<Task>, CancellationToken)

Espera que todos os objetos fornecidos Task concluam a execução, a menos que a espera seja cancelada.

WaitAll(ReadOnlySpan<Task>)

Espera que todos os objetos fornecidos Task sejam concluídos na execução.

WaitAll(Task[], CancellationToken)

Espera que todos os objetos fornecidos Task concluam a execução, a menos que a espera seja cancelada.

WaitAll(Task[], Int32, CancellationToken)

Espera que todos os objetos fornecidos Task completem a execução dentro de um número especificado de milissegundos ou até que a espera seja cancelada.

WaitAll(Task[], Int32)

Espera que todos os objetos fornecidos Task concluam a execução dentro de um número especificado de milissegundos.

WaitAll(Task[], TimeSpan)

Espera que todos os objetos canceláveis Task fornecidos concluam a execução dentro de um intervalo de tempo especificado.

WaitAll(Task[])

Espera que todos os objetos fornecidos Task sejam concluídos na execução.

WaitAny(Task[], CancellationToken)

Espera que qualquer um dos objetos fornecidos Task conclua a execução, a menos que a espera seja cancelada.

WaitAny(Task[], Int32, CancellationToken)

Aguarda que qualquer um dos objetos fornecidos Task complete a execução dentro de um número especificado de milissegundos ou até que um token de cancelamento seja cancelado.

WaitAny(Task[], Int32)

Aguarda que qualquer um dos objetos fornecidos Task complete a execução dentro de um número especificado de milissegundos.

WaitAny(Task[], TimeSpan)

Aguarda que qualquer um dos objetos fornecidos Task complete a execução dentro de um intervalo de tempo especificado.

WaitAny(Task[])

Espera que qualquer um dos objetos fornecidos Task complete a execução.

WaitAsync(CancellationToken)

Recebe um Task que será concluído quando isto Task for concluído ou quando o especificado CancellationToken tiver pedido de cancelamento.

WaitAsync(TimeSpan, CancellationToken)

Recebe um Task que será concluído quando isto Task terminar, quando o timeout especificado expirar, ou quando o especificado CancellationToken for solicitado o cancelamento.

WaitAsync(TimeSpan, TimeProvider, CancellationToken)

Recebe um Task que será concluído quando isto Task terminar, quando o timeout especificado expirar, ou quando o especificado CancellationToken for solicitado o cancelamento.

WaitAsync(TimeSpan, TimeProvider)

Recebe um Task que será concluído quando isto Task terminar ou quando o tempo de espera especificado expirar.

WaitAsync(TimeSpan)

Recebe um Task que será concluído quando isto Task terminar ou quando o tempo de espera especificado expirar.

WhenAll(IEnumerable<Task>)

Cria uma tarefa que será concluída quando todos os Task objetos de uma coleção enumerável estiverem concluídos.

WhenAll(ReadOnlySpan<Task>)

Cria uma tarefa que será concluída quando todas as tarefas fornecidas estiverem concluídas.

WhenAll(Task[])

Cria uma tarefa que será concluída quando todos os Task objetos de um array estiverem concluídos.

WhenAll<TResult>(IEnumerable<Task<TResult>>)

Cria uma tarefa que será concluída quando todos os Task<TResult> objetos de uma coleção enumerável estiverem concluídos.

WhenAll<TResult>(ReadOnlySpan<Task<TResult>>)

Cria uma tarefa que será concluída quando todas as tarefas fornecidas estiverem concluídas.

WhenAll<TResult>(Task<TResult>[])

Cria uma tarefa que será concluída quando todos os Task<TResult> objetos de um array estiverem concluídos.

WhenAny(IEnumerable<Task>)

Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída.

WhenAny(ReadOnlySpan<Task>)

Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída.

WhenAny(Task, Task)

Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída.

WhenAny(Task[])

Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída.

WhenAny<TResult>(IEnumerable<Task<TResult>>)

Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída.

WhenAny<TResult>(ReadOnlySpan<Task<TResult>>)

Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída.

WhenAny<TResult>(Task<TResult>, Task<TResult>)

Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída.

WhenAny<TResult>(Task<TResult>[])

Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída.

WhenEach(IEnumerable<Task>)

Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas.

WhenEach(ReadOnlySpan<Task>)

Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas.

WhenEach(Task[])

Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas.

WhenEach<TResult>(IEnumerable<Task<TResult>>)

Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas.

WhenEach<TResult>(ReadOnlySpan<Task<TResult>>)

Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas.

WhenEach<TResult>(Task<TResult>[])

Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas.

Yield()

Cria uma tarefa aguardável que retorna assíncronamente ao contexto atual quando aguardada.

Implementações de Interface Explícita

Name Descrição
IAsyncResult.AsyncWaitHandle

Obtém um WaitHandle que pode ser usado para esperar que a tarefa seja concluída.

IAsyncResult.CompletedSynchronously

Obtém uma indicação de se a operação foi concluída de forma síncrona.

Métodos da Extensão

Name Descrição
AsAsyncAction(Task)

Retorna uma ação assíncrona do Windows Runtime que representa uma tarefa iniciada.

DispatcherOperationWait(Task, TimeSpan)

Espera o tempo especificado para que o subjacente DispatcherOperation seja concluído.

DispatcherOperationWait(Task)

Espera indefinidamente que o subjacente DispatcherOperation seja concluído.

IsDispatcherOperationTask(Task)

Devolve um valor que indica se isto Task está associado a um DispatcherOperation.

Aplica-se a

Segurança de Thread

Todos os membros de Task, exceto Dispose(), são seguros para threads e podem ser usados a partir de múltiplas threads em simultâneo.

Ver também