Task Класс

Определение

Представляет асинхронную операцию.

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
Наследование
Task
Производный
Реализации

Комментарии

Класс Task представляет одну операцию, которая не возвращает значение и обычно выполняется асинхронно. Taskобъекты являются одним из центральных компонентов асинхронного шаблона на основе задач, впервые представленного в платформа .NET Framework 4. Поскольку работа, выполняемая Task объектом, обычно выполняется асинхронно в потоке пула потоков, а не синхронно в основном потоке приложения, для определения состояния задачи можно использовать Status свойство , а также IsCanceledсвойства , IsCompletedи IsFaulted . Чаще всего лямбда-выражение используется для указания работы, которую выполняет задача.

Для операций, возвращающих значения, используется Task<TResult> класс .

Содержание

Примеры создания экземпляров задач
Создание и выполнение задачи
Разделение создания и выполнения задач
Ожидание выполнения одной или нескольких задач
Задачи и региональные параметры
Для разработчиков отладчика

Создание экземпляра задачи

В следующем примере создаются и выполняются четыре задачи. Три задачи выполняют Action<T> делегат с именем action, который принимает аргумент типа Object. Четвертая задача выполняет лямбда-выражение ( Action делегат), которое определено в вызове метода создания задачи. Каждая задача создается и выполняется по-разному:

  • Экземпляр задачи t1 создается путем вызова конструктора класса Task, но запускается путем вызова его Start() метода только после запуска задачи t2 .

  • Задача t2 создается и запускается в одном вызове метода путем TaskFactory.StartNew(Action<Object>, Object) вызова метода .

  • Задача t3 создается и запускается в одном вызове метода путем Run(Action) вызова метода .

  • Задача t4 выполняется синхронно в основном потоке RunSynchronously() путем вызова метода .

Поскольку задача t4 выполняется синхронно, она выполняется в основном потоке приложения. Остальные задачи обычно выполняются асинхронно в одном или нескольких потоках пула потоков.

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
Imports System.Threading
Imports System.Threading.Tasks

Module Example
    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

Создание и выполнение задачи

Task Экземпляры могут создаваться различными способами. Наиболее распространенным подходом, который доступен начиная с платформа .NET Framework 4.5, является вызов статического Run метода. Метод Run предоставляет простой способ запуска задачи, используя значения по умолчанию и не требуя дополнительных параметров. В следующем примере метод используется Run(Action) для запуска задачи, которая выполняет цикл, а затем отображает количество итераций цикла:

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
Imports System.Threading.Tasks

Module Example
   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

Альтернативным и наиболее распространенным методом запуска задачи в платформа .NET Framework 4 является статический TaskFactory.StartNew метод. Свойство Task.Factory возвращает TaskFactory объект . Перегрузки TaskFactory.StartNew метода позволяют указать параметры для передачи параметрам создания задачи и планировщику задач. В следующем примере используется TaskFactory.StartNew метод для запуска задачи. Это функционально эквивалентно коду в предыдущем примере.

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
Imports System.Threading.Tasks

Module Example
   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

Более полные примеры см. в разделе Асинхронное программирование на основе задач.

Разделение создания и выполнения задач

Класс Task также предоставляет конструкторы, которые инициализируют задачу, но не планируют ее выполнение. По соображениям Task.Run производительности метод или TaskFactory.StartNew является предпочтительным механизмом для создания и планирования вычислительных задач, но в сценариях, где создание и планирование должны быть разделены, можно использовать конструкторы, а затем вызвать метод , чтобы запланировать Task.Start выполнение задачи на более позднее время.

Ожидание выполнения одной или нескольких задач

Поскольку задачи обычно выполняются асинхронно в потоке пула потоков, поток, создающий и запускающий задачу, продолжает выполнение сразу после создания экземпляра задачи. В некоторых случаях, когда вызывающий поток является основным потоком приложения, приложение может завершиться до фактического начала выполнения задачи. В других случаях логика приложения может потребовать, чтобы вызывающий поток продолжал выполнение только после завершения выполнения одной или нескольких задач. Вы можете синхронизировать выполнение вызывающего потока и запускаемых им асинхронных задач, вызвав Wait метод для ожидания завершения одной или нескольких задач.

Чтобы дождаться завершения одной задачи, можно вызвать ее Task.Wait метод. Вызов Wait метода блокирует вызывающий поток до тех пор, пока не завершится выполнение экземпляра одного класса.

В следующем примере метод без Wait() параметров вызывается для безусловного ожидания завершения задачи. Задача имитирует работу, вызывая Thread.Sleep метод для спящего режима в течение двух секунд.

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
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   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

Можно также условно дождаться завершения задачи. Методы Wait(Int32) и Wait(TimeSpan) блокируют вызывающий поток до завершения задачи или истечения интервала времени ожидания, в зависимости от того, что наступит раньше. Так как в следующем примере запускается задача, которая выполняется в спящем режиме в течение двух секунд, но определяет значение времени ожидания в одну секунду, вызывающий поток блокируется до истечения времени ожидания и до завершения выполнения задачи.

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.
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   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.

Вы также можете предоставить маркер отмены, вызвав методы Wait(CancellationToken) и Wait(Int32, CancellationToken) . Если свойство маркера IsCancellationRequested имеет значение true или становится во true время Wait выполнения метода, метод создает исключение OperationCanceledException.

В некоторых случаях может потребоваться дождаться завершения первой из серии выполняемых задач, но не волнуйтесь, какая это задача. Для этой цели можно вызвать одну из перегрузок Task.WaitAny метода . В следующем примере создаются три задачи, каждая из которых переходит в спящий режим на интервал, определенный генератором случайных чисел. Метод WaitAny(Task[]) ожидает завершения первой задачи. Затем в примере отображаются сведения о состоянии всех трех задач.

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
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   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

Вы также можете дождаться завершения всех рядов задач, вызвав WaitAll метод . В следующем примере создается десять задач, ожидается завершение всех десяти задач, а затем отображается их состояние.

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
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   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

Обратите внимание, что при ожидании завершения одной или нескольких задач все исключения, создаваемые в выполняющихся задачах, распространяются в потоке, который вызывает Wait метод , как показано в следующем примере. Он запускает 12 задач, три из которых выполняются обычным образом, а три — исключение. Из оставшихся шести задач три отменяется до их запуска, а три — во время выполнения. Исключения создаются в вызове WaitAll метода и обрабатываются блоком/trycatch .

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
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   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
                                           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

Дополнительные сведения об обработке исключений в асинхронных операциях на основе задач см. в разделе Обработка исключений.

Задачи и региональные параметры

Начиная с классических приложений, предназначенных для платформа .NET Framework 4.6, язык и региональные параметры потока, создающего и вызывающего задачу, становятся частью контекста потока. То есть независимо от текущего языка и региональных параметров потока, в котором выполняется задача, текущим языком и региональными параметрами задачи является язык и региональные параметры вызывающего потока. Для приложений, предназначенных для версий платформа .NET Framework до платформа .NET Framework 4.6, язык и региональные параметры задачи — это язык и региональные параметры потока, в котором выполняется задача. Дополнительные сведения см. в разделе "Язык и региональные параметры и асинхронные операции на основе задач" этой статьи CultureInfo .

Примечание

Приложения Магазина следуют среда выполнения Windows в параметре и получении языка и региональных параметров по умолчанию.

Для разработчиков отладчика

Для разработчиков, реализующих пользовательские отладчики, может быть полезно несколько внутренних и закрытых членов задачи (они могут изменяться от выпуска к выпуску). Поле m_taskId служит резервным хранилищем для Id свойства, однако доступ к этому полю непосредственно из отладчика может быть более эффективным, чем доступ к тому же значению через метод получения свойства ( s_taskIdCounter счетчик используется для получения следующего доступного идентификатора для задачи). Аналогичным образом в m_stateFlags поле хранятся сведения о текущем этапе жизненного цикла задачи, которые также доступны через Status свойство . В m_action поле хранится ссылка на делегат задачи, а в m_stateObject поле — асинхронное состояние, переданное в задачу разработчиком. Наконец, для отладчиков, которые анализируют кадры стека, InternalWait метод служит потенциальным маркером, когда задача входит в операцию ожидания.

Конструкторы

Task(Action)

Инициализирует новую задачу Task с заданным действием.

Task(Action, CancellationToken)

Инициализирует новую задачу Task с заданным действием и токеном CancellationToken.

Task(Action, CancellationToken, TaskCreationOptions)

Инициализирует новую задачу Task с заданными действием и параметрами создания.

Task(Action, TaskCreationOptions)

Инициализирует новую задачу Task с заданными действием и параметрами создания.

Task(Action<Object>, Object)

Инициализирует новую задачу Task с заданным действием и состоянием.

Task(Action<Object>, Object, CancellationToken)

Инициализирует новую задачу Task с заданными действием, состоянием и параметрами.

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

Инициализирует новую задачу Task с заданными действием, состоянием и параметрами.

Task(Action<Object>, Object, TaskCreationOptions)

Инициализирует новую задачу Task с заданными действием, состоянием и параметрами.

Свойства

AsyncState

Получает объект состояния, предоставленный при создании задачи Task, или значение null, если объект не предоставлен.

CompletedTask

Возвращает задачу, которая уже завершилась успешно.

CreationOptions

Возвращает объект TaskCreationOptions, используемый для создания данной задачи.

CurrentId

Возвращает идентификатор выполняющейся в настоящее время задачи Task.

Exception

Возвращает объект AggregateException, который привел к преждевременному завершению задачи Task. Если задача Task завершилась успешно или еще не создала ни одного исключения, возвращает значение null.

Factory

Предоставляет доступ к фабричным методам для создания и настройки экземпляров Task и Task<TResult>.

Id

Возвращает идентификатор указанного экземпляра Task.

IsCanceled

Возвращает значение, указывающее, завершилось ли выполнение данного экземпляра Task из-за отмены.

IsCompleted

Получает значение, указывающее, завершена ли задача.

IsCompletedSuccessfully

Возвращает значение, указывающее, выполнена ли задача.

IsFaulted

Возвращает значение, указывающее, завершилась ли задача Task из-за необработанного исключения.

Status

Получает состояние TaskStatus данной задачи.

Методы

ConfigureAwait(Boolean)

Настраивает объект типа awaiter, используемый для данного объекта Task.

ContinueWith(Action<Task,Object>, Object)

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии и которое выполняется после завершения целевой задачи Task.

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

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии и маркер отмены и которое выполняется асинхронно после завершения целевой задачи Task.

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

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии и маркер отмены и которое выполняется после завершения целевой задачи Task. Продолжение выполняется на основе набора указанных условий и использует указанный планировщик.

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

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии и которое выполняется после завершения целевой задачи Task. Продолжение выполняется на основе набора указанных условий.

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

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии и выполняется асинхронно после завершения целевой задачи Task. Продолжение использует указанный планировщик.

ContinueWith(Action<Task>)

Создает продолжение, которое выполняется асинхронно после завершения выполнения целевой задачи Task.

ContinueWith(Action<Task>, CancellationToken)

Создает продолжение, которое получает маркер отмены и которое выполняется асинхронно после завершения целевой задачи Task.

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

Создает продолжение, которое выполняется после завершения целевой задачи в соответствии с заданными параметрами TaskContinuationOptions. Продолжение получает маркер отмены и использует указанный планировщик.

ContinueWith(Action<Task>, TaskContinuationOptions)

Создает продолжение, которое выполняется после завершения целевой задачи в соответствии с заданными параметрами TaskContinuationOptions.

ContinueWith(Action<Task>, TaskScheduler)

Создает продолжение, которое выполняется асинхронно после завершения выполнения целевой задачи Task. Продолжение использует указанный планировщик.

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

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии, выполняется асинхронно после завершения целевой задачи Task и возвращает значение.

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

Создает продолжение, которое выполняется асинхронно после завершения целевой задачи Task и возвращает значение. Продолжение получает предоставленные вызывающей стороной сведения и маркер отмены.

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

Создает продолжение, которое выполняется на основе указанных параметров продолжения задачи после завершения целевой задачи Task и которое возвращает значение. Продолжение получает предоставленные вызывающей стороной сведения и маркер отмены, а также использует указанный планировщик.

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

Создает продолжение, которое выполняется на основе указанных параметров продолжения задачи после завершения целевой задачи Task. Продолжение получает предоставленные вызывающей стороной сведения.

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

Создает продолжение, которое выполняется асинхронно после завершения выполнения целевой задачи Task. Продолжение получает предоставленные вызывающей стороной сведения и использует указанный планировщик.

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

Создает продолжение, которое выполняется асинхронно после завершения целевой задачи Task<TResult> и возвращает значение.

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

Создает продолжение, которое выполняется асинхронно после завершения целевой задачи Task и возвращает значение. Продолжение получает маркер отмены.

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

Создает продолжение, которое выполняется в соответствии с заданными параметрами и которое возвращает значение. Продолжение получает маркер отмены и использует указанный планировщик.

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

Создает продолжение, которое выполняется в соответствии с заданными параметрами и которое возвращает значение.

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

Создает продолжение, которое выполняется асинхронно после завершения целевой задачи Task и возвращает значение. Продолжение использует указанный планировщик.

Delay(Int32)

Создает задачу, которая завершается через заданное количество миллисекунд.

Delay(Int32, CancellationToken)

Создает отменяемую задачу, которая завершается через заданное количество миллисекунд.

Delay(TimeSpan)

Создает задачу, которая завершается через заданное время.

Delay(TimeSpan, CancellationToken)

Создает отменяемую задачу, которая завершается через заданное время.

Dispose()

Освобождает все ресурсы, используемые текущим экземпляром класса Task.

Dispose(Boolean)

Удаляет задачуTask, освобождая все используемые ею неуправляемые ресурсы.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
FromCanceled(CancellationToken)

Создает задачу Task, которая завершилась из-за отмены с помощью указанного маркера отмены.

FromCanceled<TResult>(CancellationToken)

Создает задачу Task<TResult>, которая завершилась из-за отмены с помощью указанного маркера отмены.

FromException(Exception)

Создает задачу Task, которая завершилась с указанным исключением.

FromException<TResult>(Exception)

Создает задачу Task<TResult>, которая завершилась с указанным исключением.

FromResult<TResult>(TResult)

Создает Task<TResult>, которая завершается удачно с указанным результатом.

GetAwaiter()

Получает объект типа awaiter, используемый для данного объекта Task.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
Run(Action)

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task, представляющий эту работу.

Run(Action, CancellationToken)

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task, представляющий эту работу. Токен отмены позволяет отменить задачу, если она не была начата.

Run(Func<Task>)

Ставит в очередь указанную работу для запуска в пуле потоков и возвращает прокси для задачи, возвращаемой функцией function.

Run(Func<Task>, CancellationToken)

Ставит в очередь указанную работу для запуска в пуле потоков и возвращает прокси для задачи, возвращаемой функцией function. Токен отмены позволяет отменить задачу, если она не была начата.

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

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает прокси для задачи Task(TResult), возвращаемой function. Токен отмены позволяет отменить задачу, если она не была начата.

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

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает прокси для задачи Task(TResult), возвращаемой function.

Run<TResult>(Func<TResult>)

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task<TResult>, представляющий эту работу. Токен отмены позволяет отменить задачу, если она не была начата.

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

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task(TResult), представляющий эту работу.

RunSynchronously()

Синхронно выполняет задачу Task в текущем планировщике TaskScheduler.

RunSynchronously(TaskScheduler)

Синхронно выполняет задачу Task в предоставленном планировщике TaskScheduler.

Start()

Запускает задачу Task, планируя ее выполнение в текущем планировщике TaskScheduler.

Start(TaskScheduler)

Запускает задачу Task, планируя ее выполнение в заданном планировщике TaskScheduler.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
Wait()

Ожидает завершения выполнения задачи Task.

Wait(CancellationToken)

Ожидает завершения выполнения задачи Task. Ожидание завершается, если токен отмены отменяется до завершения задачи.

Wait(Int32)

Ожидает завершения задачи Task в течение указанного числа миллисекунд.

Wait(Int32, CancellationToken)

Ожидает завершения выполнения задачи Task. Ожидание завершается, если время ожидания истекает или токен отмены отменяется до завершения задачи.

Wait(TimeSpan)

Ожидает завершения выполнения задач Task в течение указанного временного периода.

Wait(TimeSpan, CancellationToken)

Ожидает завершения выполнения задачи Task.

WaitAll(Task[])

Ожидает завершения выполнения всех указанных объектов Task.

WaitAll(Task[], CancellationToken)

Ожидает завершения выполнения всех указанных объектов Task, пока ожидание не будет отменено.

WaitAll(Task[], Int32)

Ожидает завершения выполнения всех указанных объектов Task в течение указанного числа миллисекунд.

WaitAll(Task[], Int32, CancellationToken)

Ожидает завершения выполнения всех указанных объектов Task в течение указанного числа миллисекунд или до отмены ожидания.

WaitAll(Task[], TimeSpan)

Ожидает завершения выполнения всех указанных отменяемых объектов Task в течение указанного временного интервала.

WaitAny(Task[])

Ожидает завершения выполнения любого из указанных объектов Task.

WaitAny(Task[], CancellationToken)

Ожидает завершения выполнения всех указанных объектов Task, пока ожидание не будет отменено.

WaitAny(Task[], Int32)

Ожидает завершения выполнения любого из указанных объектов Task в течение указанного числа миллисекунд.

WaitAny(Task[], Int32, CancellationToken)

Ожидает завершения выполнения всех указанных объектов Task в течение указанного числа миллисекунд или до отмены токена отмены.

WaitAny(Task[], TimeSpan)

Ожидает завершения выполнения любого из указанных отменяемых объектов Task в течение указанного временного интервала.

WaitAsync(CancellationToken)

Возвращает объект , Task который завершится после завершения или Task при запросе отмены указанного CancellationToken объекта.

WaitAsync(TimeSpan)

Возвращает объект , Task который будет завершен по завершении или Task по истечении указанного времени ожидания.

WaitAsync(TimeSpan, CancellationToken)

Возвращает объект , Task который будет завершен после завершения, Task по истечении указанного времени ожидания или при запросе отмены указанного CancellationToken объекта.

WhenAll(IEnumerable<Task>)

Создает задачу, которая будет выполнена, когда все объекты Task в перечисляемой коллекции будут завершены.

WhenAll(Task[])

Создает задачу, которая будет выполнена, когда все Task объекты в массиве будут завершены.

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

Создает задачу, которая будет выполнена, когда все объекты Task<TResult> в перечисляемой коллекции будут завершены.

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

Создает задачу, которая будет выполнена, когда все Task<TResult> объекты в массиве будут завершены.

WhenAny(IEnumerable<Task>)

Создает задачу, которая будет выполнена после выполнения любой из предоставленных задач.

WhenAny(Task, Task)

Создает задачу, которая будет завершена после завершения любой из предоставленных задач.

WhenAny(Task[])

Создает задачу, которая будет выполнена после выполнения любой из предоставленных задач.

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

Создает задачу, которая будет выполнена после выполнения любой из предоставленных задач.

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

Создает задачу, которая будет завершена после завершения любой из предоставленных задач.

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

Создает задачу, которая будет выполнена после выполнения любой из предоставленных задач.

Yield()

Создает поддерживающий ожидание объект задачи, который асинхронным образом выдает возврат текущему контексту, когда его ожидают.

Явные реализации интерфейса

IAsyncResult.AsyncWaitHandle

Возвращает дескриптор WaitHandle, который можно использовать для ожидания завершения задачи.

IAsyncResult.CompletedSynchronously

Получает значение, указывающее, синхронно ли выполнена операция.

Методы расширения

DispatcherOperationWait(Task)

Ожидает завершения базовой операции DispatcherOperation в течение неограниченного времени.

DispatcherOperationWait(Task, TimeSpan)

Ожидает истечения заданного количества времени для базового DispatcherOperation.

IsDispatcherOperationTask(Task)

Возвращает значение, указывающее, связан ли данный Task с DispatcherOperation.

AsAsyncAction(Task)

Возвращает асинхронное действие среды выполнения Windows, представляющее запущенную задачу.

Применяется к

Потокобезопасность

Все члены Task, за исключением Dispose(), являются потокобезопасными и могут использоваться из нескольких потоков одновременно.

См. также раздел