Task Classe

Définition

Représente une opération asynchrone.

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
Héritage
Task
Dérivé
Implémente

Remarques

La Task classe représente une seule opération qui ne retourne pas de valeur et qui s’exécute généralement de manière asynchrone. Task les objets sont l’un des composants centraux du modèle asynchrone basé sur les tâches. Étant donné que le travail effectué par un Task objet s’exécute généralement de manière asynchrone sur un thread de pool de threads plutôt que de manière synchrone sur le thread d’application principal, vous pouvez utiliser la Status propriété, ainsi que les IsCanceledIsCompletedpropriétés , et IsFaulted les propriétés, pour déterminer l’état d’une tâche. La plupart du temps, une expression lambda est utilisée pour spécifier le travail que la tâche doit effectuer.

Pour les opérations qui retournent des valeurs, vous utilisez la Task<TResult> classe.

Création de tâches

L’exemple suivant crée et exécute quatre tâches. Trois tâches exécutent un Action<T> délégué nommé action, qui accepte un argument de type Object. Une quatrième tâche exécute une expression lambda (un délégué Action) définie comme incluse dans l’appel à la méthode de création de tâche. Chaque tâche est instanciée et exécutée de manière différente :

  • La tâche t1 est instanciée en appelant un constructeur de la classe Task, mais elle commence en appelant sa méthode Start() uniquement après le démarrage de la tâche t2.

  • La tâche t2 est instanciée et démarrée dans un appel de méthode unique en appelant la TaskFactory.StartNew(Action<Object>, Object) méthode.

  • La tâche t3 est instanciée et démarrée dans un appel de méthode unique en appelant la Run(Action) méthode.

  • La tâche t4 est exécutée de manière synchrone sur le thread principal en appelant la RunSynchronously() méthode.

Étant donné que la tâche t4 s’exécute de façon synchrone, elle s’exécute sur le thread d’application principal. Les tâches restantes s'exécutent de manière asynchrone en général sur un ou plusieurs threads du 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

Créer et exécuter une tâche

Vous pouvez créer Task des instances de différentes façons. L’approche la plus courante consiste à appeler la méthode statique Run . La Run méthode fournit un moyen simple de démarrer une tâche à l’aide de valeurs par défaut et sans nécessiter de paramètres supplémentaires. L’exemple suivant utilise la Run(Action) méthode pour démarrer une tâche qui effectue une boucle, puis affiche le nombre d’itérations de boucle :

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

Une alternative est la méthode statique TaskFactory.StartNew . La propriété Task.Factory renvoie un objet TaskFactory. Les surcharges de la méthode TaskFactory.StartNew vous permettent de spécifier des paramètres à passer aux options de création de tâche et à un planificateur de tâches. L’exemple suivant utilise la TaskFactory.StartNew méthode pour démarrer une tâche. Il est fonctionnellement équivalent au code de l’exemple précédent.

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

Pour obtenir des exemples plus complets, consultez Programmation asynchrone basée sur les tâches.

Création et exécution de tâches distinctes

La Task classe fournit également des constructeurs qui initialisent la tâche, mais qui ne le planifient pas pour l’exécution. Pour des raisons de performances, la méthode Task.Run ou TaskFactory.StartNew est le mécanisme préféré pour créer et planifier des tâches de calcul, mais pour les scénarios où la création et la planification doivent être séparées, vous pouvez utiliser les constructeurs, puis appeler la méthode Task.Start pour planifier la tâche ultérieurement.

Attendez la fin d’une tâche

Étant donné que les tâches s’exécutent généralement de manière asynchrone sur un thread de pool de threads, le thread qui crée et démarre la tâche continue l’exécution dès que la tâche a été instanciée. Dans certains cas, lorsque le thread appelant est le thread d’application principal, l’application peut se terminer avant que la tâche commence réellement l’exécution. Dans d’autres, la logique de votre application peut exiger que le thread appelant continue l’exécution uniquement quand une ou plusieurs tâches ont terminé l’exécution. Vous pouvez synchroniser l’exécution du thread appelant et les tâches asynchrones qu’il lance en appelant une Wait méthode pour attendre qu’une ou plusieurs tâches se terminent.

Pour attendre la fin d’une tâche unique, vous pouvez appeler sa Task.Wait méthode. Un appel à la Wait méthode bloque le thread appelant jusqu’à ce que l’instance de classe unique ait terminé l’exécution.

L’exemple suivant appelle la méthode sans Wait() paramètre pour attendre inconditionnellement jusqu’à ce qu’une tâche se termine. La tâche simule le travail en appelant la méthode Thread.Sleep pour se mettre en veille pendant deux secondes.

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

Vous pouvez également attendre conditionnellement qu’une tâche se termine. Les méthodes Wait(Int32) et Wait(TimeSpan) bloquent le thread appelant jusqu’à ce que la tâche se termine ou qu’un délai d’attente s’écoule, selon le cas. Dans la mesure où l’exemple suivant lance une tâche qui se met en veille pendant deux secondes, mais définit une valeur d’expiration d’une seconde, le thread appelant bloque jusqu’à l’expiration du délai d’expiration et avant l’exécution de la tâche.

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.

Vous pouvez également fournir un jeton d'annulation en appelant les méthodes Wait(CancellationToken) et Wait(Int32, CancellationToken). Si la propriété IsCancellationRequested du jeton est true ou devient true pendant l'exécution de la méthode Wait, la méthode lève une exception OperationCanceledException.

Dans certains cas, vous pouvez attendre que la première tâche d'une série de tâches en cours d'exécution se termine, mais peu importe laquelle c'est. À cet effet, vous pouvez appeler l’une des surcharges de la méthode Task.WaitAny. L’exemple suivant crée trois tâches, chacune étant en veille pour un intervalle déterminé par un générateur de nombres aléatoires. La WaitAny(Task[]) méthode attend la fin de la première tâche. L’exemple affiche ensuite des informations sur l’état des trois tâches.

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

Vous pouvez également attendre que toutes les séries de tâches se terminent en appelant la WaitAll méthode. L’exemple suivant crée dix tâches, attend que toutes les dix se terminent, puis affiche leur état.

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

Notez que lorsque vous attendez qu’une ou plusieurs tâches se terminent, toutes les exceptions levées dans les tâches qui s'exécutent sont propagées sur le thread qui appelle la méthode Wait, comme l’illustre l’exemple suivant. L'opération lance 12 tâches, dont trois se terminent normalement et trois d’entre elles lèvent une exception. Parmi les six tâches restantes, trois sont annulées avant leur début et trois sont annulées pendant leur exécution. Les exceptions sont levées lors de l'appel de la méthode WaitAll et sont gérées par un bloc 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

Pour plus d’informations sur la gestion des exceptions dans les opérations asynchrones basées sur des tâches, consultez Gestion des exceptions.

Tâches et culture

À compter des applications de bureau qui ciblent .NET Framework 4.6, la culture du thread qui crée et appelle une tâche fait partie du contexte du thread. Autrement dit, quelle que soit la culture actuelle du thread sur lequel la tâche s’exécute, la culture actuelle de la tâche est celle du thread appelant. Pour les applications qui ciblent des versions de .NET Framework antérieures à .NET Framework 4.6, la culture de la tâche est la culture du thread sur lequel la tâche s’exécute. Pour plus d’informations, consultez la section « Opérations asynchrones basées sur la culture et les tâches » dans la CultureInfo rubrique.

Note

Les applications du Microsoft Store suivent le Windows Runtime pour définir et obtenir la culture par défaut.

Pour les développeurs de débogueur

Pour les développeurs qui implémentent des débogueurs personnalisés, plusieurs membres internes et privés de la tâche peuvent être utiles (ces membres peuvent changer d'une version à l'autre). Le m_taskId champ sert de support de stockage pour la propriété Id, mais l'accès à ce champ directement à partir d'un débogueur peut être plus efficace que l'accès à la même valeur via l'accesseur de la propriété (le compteur s_taskIdCounter est utilisé pour récupérer le prochain ID disponible pour une tâche). De même, le m_stateFlags champ stocke des informations sur l’étape de cycle de vie actuelle de la tâche, les informations sont également accessibles via la Status propriété. Le m_action champ stocke une référence au délégué de la tâche, et le m_stateObject champ stocke l’état asynchrone transmis à la tâche par le développeur. Enfin, pour les débogueurs qui analysent les trames de pile, la méthode InternalWait sert de marqueur potentiel lorsqu’une tâche entre dans une opération d’attente.

Constructeurs

Nom Description
Task(Action, CancellationToken, TaskCreationOptions)

Initialise une nouvelle Task avec les options d’action et de création spécifiées.

Task(Action, CancellationToken)

Initialise un nouveau Task avec l’action spécifiée et CancellationToken.

Task(Action, TaskCreationOptions)

Initialise une nouvelle Task avec les options d’action et de création spécifiées.

Task(Action)

Initialise un nouveau Task avec l’action spécifiée.

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

Initialise un nouveau Task avec l’action, l’état et les options spécifiés.

Task(Action<Object>, Object, CancellationToken)

Initialise une nouvelle Task avec l’action, l’état et CancellationToken.

Task(Action<Object>, Object, TaskCreationOptions)

Initialise un nouveau Task avec l’action, l’état et les options spécifiés.

Task(Action<Object>, Object)

Initialise un nouveau Task avec l’action et l’état spécifiés.

Propriétés

Nom Description
AsyncState

Obtient l’objet d’état fourni lors de la création ou de la Task valeur Null si aucun n’a été fourni.

CompletedTask

Obtient une tâche qui s’est déjà terminée avec succès.

CreationOptions

Obtient l’élément TaskCreationOptions utilisé pour créer cette tâche.

CurrentId

Retourne l’ID de l’exécution Taskactuelle .

Exception

Obtient l’élément AggregateException qui a provoqué la Task fin prématurément. Si l’opération Task s’est terminée correctement ou n’a pas encore levée d’exceptions, cela retourne null.

Factory

Fournit l’accès aux méthodes de fabrique pour la création et la configuration Task et Task<TResult> les instances.

Id

Obtient un ID pour cette Task instance.

IsCanceled

Obtient si cette Task instance a terminé l’exécution en raison d’une annulation.

IsCompleted

Obtient une valeur qui indique si la tâche est terminée.

IsCompletedSuccessfully

Obtient si la tâche s’est exécutée à la fin.

IsFaulted

Obtient si l’opération Task terminée en raison d’une exception non gérée.

Status

Obtient la TaskStatus tâche.

Méthodes

Nom Description
ConfigureAwait(Boolean)

Configure un awaiter utilisé pour l’attendre Task.

ConfigureAwait(ConfigureAwaitOptions)

Configure un awaiter utilisé pour l’attendre Task.

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

Crée une continuation qui reçoit les informations d’état fournies par l’appelant et un jeton d’annulation et qui s’exécute une fois la cible Task terminée. La continuation s’exécute en fonction d’un ensemble de conditions spécifiées et utilise un planificateur spécifié.

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

Crée une continuation qui reçoit les informations d’état fournies par l’appelant et un jeton d’annulation et qui s’exécute de manière asynchrone lorsque la cible Task se termine.

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

Crée une continuation qui reçoit les informations d’état fournies par l’appelant et s’exécute une fois la cible Task terminée. La continuation s’exécute en fonction d’un ensemble de conditions spécifiées.

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

Crée une continuation qui reçoit les informations d’état fournies par l’appelant et s’exécute de façon asynchrone lorsque la cible Task se termine. La continuation utilise un planificateur spécifié.

ContinueWith(Action<Task,Object>, Object)

Crée une continuation qui reçoit les informations d’état fournies par l’appelant et s’exécute une fois la cible Task terminée.

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

Crée une continuation qui s’exécute lorsque la tâche cible est en concurrence en fonction de la valeur spécifiée TaskContinuationOptions. La continuation reçoit un jeton d’annulation et utilise un planificateur spécifié.

ContinueWith(Action<Task>, CancellationToken)

Crée une continuation qui reçoit un jeton d’annulation et s’exécute de façon asynchrone une fois la cible Task terminée.

ContinueWith(Action<Task>, TaskContinuationOptions)

Crée une continuation qui s’exécute lorsque la tâche cible se termine en fonction de la valeur spécifiée TaskContinuationOptions.

ContinueWith(Action<Task>, TaskScheduler)

Crée une continuation qui s’exécute de manière asynchrone une fois la cible Task terminée. La continuation utilise un planificateur spécifié.

ContinueWith(Action<Task>)

Crée une continuation qui s’exécute de manière asynchrone une fois la cible Task terminée.

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

Crée une continuation qui s’exécute en fonction des options de continuation de tâche spécifiées lorsque la cible Task se termine et retourne une valeur. La continuation reçoit les informations d’état fournies par l’appelant et un jeton d’annulation et utilise le planificateur spécifié.

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

Crée une continuation qui s’exécute de façon asynchrone lorsque la cible Task se termine et retourne une valeur. La continuation reçoit les informations d’état fournies par l’appelant et un jeton d’annulation.

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

Crée une continuation qui s’exécute en fonction des options de continuation de tâche spécifiées une fois la cible Task terminée. La continuation reçoit les informations d’état fournies par l’appelant.

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

Crée une continuation qui s’exécute de manière asynchrone une fois la cible Task terminée. La continuation reçoit les informations d’état fournies par l’appelant et utilise un planificateur spécifié.

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

Crée une continuation qui reçoit les informations d’état fournies par l’appelant et s’exécute de façon asynchrone lorsque la cible Task se termine et retourne une valeur.

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

Crée une continuation qui s’exécute en fonction des options de continuation spécifiées et retourne une valeur. La continuation est passée à un jeton d’annulation et utilise un planificateur spécifié.

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

Crée une continuation qui s’exécute de façon asynchrone lorsque la cible Task se termine et retourne une valeur. La continuation reçoit un jeton d’annulation.

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

Crée une continuation qui s’exécute en fonction des options de continuation spécifiées et retourne une valeur.

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

Crée une continuation qui s’exécute de façon asynchrone lorsque la cible Task se termine et retourne une valeur. La continuation utilise un planificateur spécifié.

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

Crée une continuation qui s’exécute de façon asynchrone lorsque la cible Task<TResult> se termine et retourne une valeur.

Delay(Int32, CancellationToken)

Crée une tâche annulable qui se termine après un nombre spécifié de millisecondes.

Delay(Int32)

Crée une tâche qui se termine après un nombre spécifié de millisecondes.

Delay(TimeSpan, CancellationToken)

Crée une tâche annulable qui se termine après un intervalle de temps spécifié.

Delay(TimeSpan, TimeProvider, CancellationToken)

Crée une tâche annulable qui se termine après un intervalle de temps spécifié.

Delay(TimeSpan, TimeProvider)

Crée une tâche qui se termine après un intervalle de temps spécifié.

Delay(TimeSpan)

Crée une tâche qui se termine après un intervalle de temps spécifié.

Dispose()

Libère toutes les ressources utilisées par l’instance actuelle de la Task classe.

Dispose(Boolean)

Supprime , Tasklibère toutes ses ressources non managées.

Equals(Object)

Détermine si l’objet spécifié est égal à l’objet actuel.

(Hérité de Object)
FromCanceled(CancellationToken)

Crée un Task élément terminé en raison de l’annulation avec un jeton d’annulation spécifié.

FromCanceled<TResult>(CancellationToken)

Crée un Task<TResult> élément terminé en raison de l’annulation avec un jeton d’annulation spécifié.

FromException(Exception)

Crée un Task qui s’est terminé avec une exception spécifiée.

FromException<TResult>(Exception)

Crée un Task<TResult> élément terminé avec une exception spécifiée.

FromResult<TResult>(TResult)

Crée un résultat Task<TResult> terminé avec le résultat spécifié.

GetAwaiter()

Obtient un awaiter utilisé pour attendre ce Task.

GetHashCode()

Sert de fonction de hachage par défaut.

(Hérité de Object)
GetType()

Obtient la Type de l’instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Objectactuel.

(Hérité de Object)
Run(Action, CancellationToken)

Met en file d’attente le travail spécifié à exécuter sur le pool de threads et retourne un Task objet qui représente ce travail. Un jeton d’annulation permet d’annuler le travail s’il n’a pas encore démarré.

Run(Action)

Met en file d’attente le travail spécifié à exécuter sur le pool de threads et retourne un Task objet qui représente ce travail.

Run(Func<Task>, CancellationToken)

Met en file d’attente le travail spécifié à exécuter sur le pool de threads et retourne un proxy pour la tâche retournée par function. Un jeton d’annulation permet d’annuler le travail s’il n’a pas encore démarré.

Run(Func<Task>)

Met en file d’attente le travail spécifié à exécuter sur le pool de threads et retourne un proxy pour la tâche retournée par function.

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

Met en file d’attente le travail spécifié à exécuter sur le pool de threads et retourne un proxy pour le Task(TResult) retour par function.

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

Met en file d’attente le travail spécifié à exécuter sur le pool de threads et retourne un proxy pour le Task(TResult) retour par function. Un jeton d’annulation permet d’annuler le travail s’il n’a pas encore démarré.

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

Met en file d’attente le travail spécifié à exécuter sur le pool de threads et retourne un Task(TResult) objet qui représente ce travail.

Run<TResult>(Func<TResult>)

Met en file d’attente le travail spécifié à exécuter sur le pool de threads et retourne un Task<TResult> objet qui représente ce travail. Un jeton d’annulation permet d’annuler le travail s’il n’a pas encore démarré.

RunSynchronously()

S’exécute Task de manière synchrone sur le fichier actif TaskScheduler.

RunSynchronously(TaskScheduler)

Exécute la Task synchronisation sur l’élément TaskScheduler fourni.

Start()

Démarre le Task, en le planifiant pour l’exécution vers l’actif TaskScheduler.

Start(TaskScheduler)

Démarre le Task, en le planifiant pour l’exécution sur le fichier spécifié TaskScheduler.

ToString()

Retourne une chaîne qui représente l’objet actuel.

(Hérité de Object)
Wait()

Attend la fin de l’exécution Task .

Wait(CancellationToken)

Attend la fin de l’exécution Task . L’attente se termine si un jeton d’annulation est annulé avant la fin de la tâche.

Wait(Int32, CancellationToken)

Attend la fin de l’exécution Task . L’attente se termine si un intervalle de délai d’expiration s’écoule ou qu’un jeton d’annulation est annulé avant la fin de la tâche.

Wait(Int32)

Attend la fin de l’exécution Task dans un nombre spécifié de millisecondes.

Wait(TimeSpan, CancellationToken)

Attend la fin de l’exécution Task .

Wait(TimeSpan)

Attend la fin de l’exécution Task dans un intervalle de temps spécifié.

WaitAll(IEnumerable<Task>, CancellationToken)

Attend que tous les objets fournis Task terminent l’exécution, sauf si l’attente est annulée.

WaitAll(ReadOnlySpan<Task>)

Attend que tous les objets fournis Task terminent l’exécution.

WaitAll(Task[], CancellationToken)

Attend que tous les objets fournis Task terminent l’exécution, sauf si l’attente est annulée.

WaitAll(Task[], Int32, CancellationToken)

Attend que tous les objets fournis Task terminent l’exécution dans un nombre spécifié de millisecondes ou jusqu’à ce que l’attente soit annulée.

WaitAll(Task[], Int32)

Attend que tous les objets fournis Task terminent l’exécution dans un nombre spécifié de millisecondes.

WaitAll(Task[], TimeSpan)

Attend que tous les objets annulables Task fournis terminent l’exécution dans un intervalle de temps spécifié.

WaitAll(Task[])

Attend que tous les objets fournis Task terminent l’exécution.

WaitAny(Task[], CancellationToken)

Attend que l’un des objets fournis Task termine l’exécution, sauf si l’attente est annulée.

WaitAny(Task[], Int32, CancellationToken)

Attend que l’un des objets fournis Task termine l’exécution dans un nombre spécifié de millisecondes ou jusqu’à ce qu’un jeton d’annulation soit annulé.

WaitAny(Task[], Int32)

Attend que l’un des objets fournis Task termine l’exécution dans un nombre spécifié de millisecondes.

WaitAny(Task[], TimeSpan)

Attend que l’un des objets fournis Task termine l’exécution dans un intervalle de temps spécifié.

WaitAny(Task[])

Attend que l’un des objets fournis Task termine l’exécution.

WaitAsync(CancellationToken)

Obtient une Task opération qui se termine une fois cette Task opération terminée ou lorsque l’annulation spécifiée a été CancellationToken demandée.

WaitAsync(TimeSpan, CancellationToken)

Obtient une Task opération qui se termine lorsque Task le délai d’expiration spécifié expire ou lorsque l’annulation spécifiée a été CancellationToken demandée.

WaitAsync(TimeSpan, TimeProvider, CancellationToken)

Obtient une Task opération qui se termine lorsque Task le délai d’expiration spécifié expire ou lorsque l’annulation spécifiée a été CancellationToken demandée.

WaitAsync(TimeSpan, TimeProvider)

Obtient une Task valeur qui se termine une fois cette Task opération terminée ou lorsque le délai d’expiration spécifié expire.

WaitAsync(TimeSpan)

Obtient une Task valeur qui se termine une fois cette Task opération terminée ou lorsque le délai d’expiration spécifié expire.

WhenAll(IEnumerable<Task>)

Crée une tâche qui se termine lorsque tous les Task objets d’une collection énumérable sont terminés.

WhenAll(ReadOnlySpan<Task>)

Crée une tâche qui se termine lorsque toutes les tâches fournies sont terminées.

WhenAll(Task[])

Crée une tâche qui se termine lorsque tous les Task objets d’un tableau sont terminés.

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

Crée une tâche qui se termine lorsque tous les Task<TResult> objets d’une collection énumérable sont terminés.

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

Crée une tâche qui se termine lorsque toutes les tâches fournies sont terminées.

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

Crée une tâche qui se termine lorsque tous les Task<TResult> objets d’un tableau sont terminés.

WhenAny(IEnumerable<Task>)

Crée une tâche qui se termine lorsque l’une des tâches fournies est terminée.

WhenAny(ReadOnlySpan<Task>)

Crée une tâche qui se termine lorsque l’une des tâches fournies est terminée.

WhenAny(Task, Task)

Crée une tâche qui se termine lorsque l’une des tâches fournies est terminée.

WhenAny(Task[])

Crée une tâche qui se termine lorsque l’une des tâches fournies est terminée.

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

Crée une tâche qui se termine lorsque l’une des tâches fournies est terminée.

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

Crée une tâche qui se termine lorsque l’une des tâches fournies est terminée.

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

Crée une tâche qui se termine lorsque l’une des tâches fournies est terminée.

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

Crée une tâche qui se termine lorsque l’une des tâches fournies est terminée.

WhenEach(IEnumerable<Task>)

Crée un IAsyncEnumerable<T> résultat qui génère les tâches fournies à mesure que ces tâches se terminent.

WhenEach(ReadOnlySpan<Task>)

Crée un IAsyncEnumerable<T> résultat qui génère les tâches fournies à mesure que ces tâches se terminent.

WhenEach(Task[])

Crée un IAsyncEnumerable<T> résultat qui génère les tâches fournies à mesure que ces tâches se terminent.

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

Crée un IAsyncEnumerable<T> résultat qui génère les tâches fournies à mesure que ces tâches se terminent.

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

Crée un IAsyncEnumerable<T> résultat qui génère les tâches fournies à mesure que ces tâches se terminent.

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

Crée un IAsyncEnumerable<T> résultat qui génère les tâches fournies à mesure que ces tâches se terminent.

Yield()

Crée une tâche awaitable qui retourne de façon asynchrone le contexte actuel lorsque vous l’attendez.

Implémentations d’interfaces explicites

Nom Description
IAsyncResult.AsyncWaitHandle

Obtient un WaitHandle élément qui peut être utilisé pour attendre la fin de la tâche.

IAsyncResult.CompletedSynchronously

Obtient une indication indiquant si l’opération s’est terminée de façon synchrone.

Méthodes d’extension

Nom Description
AsAsyncAction(Task)

Retourne une action asynchrone Windows Runtime qui représente une tâche démarrée.

DispatcherOperationWait(Task, TimeSpan)

Attend la fin du délai spécifié pour que le sous-jacent DispatcherOperation se termine.

DispatcherOperationWait(Task)

Attend indéfiniment que le sous-jacent DispatcherOperation se termine.

IsDispatcherOperationTask(Task)

Retourne une valeur qui indique si elle Task est associée à un DispatcherOperation.

S’applique à

Cohérence de thread

Tous les membres de , à l’exception Taskde Dispose(), sont thread-safe et peuvent être utilisés simultanément à partir de plusieurs threads.

Voir aussi