Поделиться через


Task<TResult> Класс

Определение

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

generic <typename TResult>
public ref class Task : System::Threading::Tasks::Task
public class Task<TResult> : System.Threading.Tasks.Task
type Task<'Result> = class
    inherit Task
Public Class Task(Of TResult)
Inherits Task

Параметры типа

TResult

Тип результата, созданного этим Task<TResult>.

Наследование
Task<TResult>

Комментарии

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

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

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      var t = Task<int>.Run( () => {
                                      // Just loop.
                                      int max = 1000000;
                                      int ctr = 0;
                                      for (ctr = 0; ctr <= max; ctr++) {
                                         if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
                                            ctr++;
                                            break;
                                         }
                                      }
                                      return ctr;
                                    } );
      Console.WriteLine("Finished {0:N0} iterations.", t.Result);
   }
}
// The example displays output like the following:
//        Finished 1,000,001 loop iterations.
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim t As Task(Of Integer) = Task.Run(Function()
                                  Dim max As Integer = 1000000
                                  Dim ctr As Integer
                                  For ctr = 0 to max
                                     If ctr = max \ 2 And Date.Now.Hour <= 12 Then
                                        ctr += 1
                                        Exit For
                                     End If
                                  Next
                                  Return ctr
                               End Function)
      Console.WriteLine("Finished {0:N0} iterations.", t.Result)
   End Sub
End Module
' The example displays the following output:
'       Finished 1,000,001 loop iterations

Альтернатива и наиболее распространенный способ запуска задачи в .NET Framework 4 — вызов статического TaskFactory.StartNew или TaskFactory<TResult>.StartNew метода. Свойство Task.Factory возвращает TaskFactory объект, а Task<TResult>.Factory свойство возвращает TaskFactory<TResult> объект. Перегрузки их StartNew метода позволяют передавать аргументы, определять параметры создания задач и указывать планировщик задач. В следующем примере используется метод TaskFactory<TResult>.StartNew(Func<TResult>) для запуска задачи. Он функционально эквивалентен коду в предыдущем примере.

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      var t = Task<int>.Factory.StartNew( () => {
                                      // Just loop.
                                      int max = 1000000;
                                      int ctr = 0;
                                      for (ctr = 0; ctr <= max; ctr++) {
                                         if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
                                            ctr++;
                                            break;
                                         }
                                      }
                                      return ctr;
                               } );
      Console.WriteLine("Finished {0:N0} iterations.", t.Result);
   }
}
// The example displays the following output:
//        Finished 1000001 loop iterations
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim t = Task(Of Integer).Factory.StartNew(Function()
                                  Dim max As Integer = 1000000
                                  Dim ctr As Integer
                                  For ctr = 0 to max
                                     If ctr = max \ 2 And Date.Now.Hour <= 12 Then
                                       ctr += 1
                                       Exit For
                                     End If
                                  Next
                                  Return ctr
                               End Function)
      Console.WriteLine("Finished {0:N0} iterations.", t.Result)
   End Sub
End Module
' The example displays output like the following:
'       Finished 1,000,001 iterations

Дополнительные полные примеры см. в статье "Асинхронное программирование на основе задач".

Класс Task<TResult> также предоставляет конструкторы, которые инициализируют задачу, но не планируют ее выполнение. По соображениям Task.RunTask.Factory.StartNew производительности и методы являются предпочтительными механизмами для создания и планирования вычислительных задач, но в сценариях, когда необходимо разделить создание и планирование задач, конструкторы могут использоваться, а метод задачи может использоваться для планирования задачи Start для выполнения в дальнейшем.

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

Для операций, которые не возвращают значение, используйте Task класс. Начиная с C# 7.0, для более упрощенной задачи, которая является типом значения, а не ссылочным типом, используйте структуру System.Threading.Tasks.ValueTask<TResult> .

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

Имя Описание
Task<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions)

Инициализирует новый Task<TResult> с указанным действием, состоянием и параметрами.

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

Инициализирует новый Task<TResult> с указанным действием, состоянием и параметрами.

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

Инициализирует новый Task<TResult> с указанным действием, состоянием и параметрами.

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

Инициализирует новый Task<TResult> с указанной функцией и состоянием.

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

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

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

Инициализирует новый Task<TResult> с указанной функцией.

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

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

Task<TResult>(Func<TResult>)

Инициализирует новый Task<TResult> с указанной функцией.

Свойства

Имя Описание
AsyncState

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

(Унаследовано от Task)
CreationOptions

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

(Унаследовано от Task)
Exception

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

(Унаследовано от Task)
Factory

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

Id

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

(Унаследовано от Task)
IsCanceled

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

(Унаследовано от Task)
IsCompleted

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

(Унаследовано от Task)
IsCompletedSuccessfully

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

(Унаследовано от Task)
IsFaulted

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

(Унаследовано от Task)
Result

Возвращает значение результата этого Task<TResult>параметра.

Status

TaskStatus Возвращает эту задачу.

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

Методы

Имя Описание
ConfigureAwait(Boolean)

Настраивает средство ожидания, используемое для ожидания этого Task<TResult>.

ConfigureAwait(ConfigureAwaitOptions)

Настраивает средство ожидания, используемое для ожидания этого Task.

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

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

(Унаследовано от Task)
ContinueWith(Action<Task,Object>, Object, CancellationToken)

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

(Унаследовано от Task)
ContinueWith(Action<Task,Object>, Object, TaskContinuationOptions)

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

(Унаследовано от Task)
ContinueWith(Action<Task,Object>, Object, TaskScheduler)

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

(Унаследовано от Task)
ContinueWith(Action<Task,Object>, Object)

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

(Унаследовано от Task)
ContinueWith(Action<Task<TResult>,Object>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ContinueWith(Action<Task<TResult>>)

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

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

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

(Унаследовано от Task)
ContinueWith(Action<Task>, CancellationToken)

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

(Унаследовано от Task)
ContinueWith(Action<Task>, TaskContinuationOptions)

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

(Унаследовано от Task)
ContinueWith(Action<Task>, TaskScheduler)

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

(Унаследовано от Task)
ContinueWith(Action<Task>)

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

(Унаследовано от Task)
ContinueWith<TNewResult>(Func<Task<TResult>,Object,TNewResult>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken)

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskContinuationOptions)

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskScheduler)

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,Object,TResult>, Object)

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,TResult>, CancellationToken)

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,TResult>, TaskContinuationOptions)

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,TResult>, TaskScheduler)

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

(Унаследовано от Task)
ContinueWith<TResult>(Func<Task,TResult>)

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

(Унаследовано от Task)
Dispose()

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

(Унаследовано от Task)
Dispose(Boolean)

TaskУдаляет все неуправляемые ресурсы.

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

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

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

Получает средство ожидания, используемое для ожидания этого Task<TResult>.

GetHashCode()

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

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

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

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

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

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

Task Выполняется синхронно в текущемTaskScheduler.

(Унаследовано от Task)
RunSynchronously(TaskScheduler)

Task Выполняется синхронно на предоставленном объектеTaskScheduler.

(Унаследовано от Task)
Start()

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

(Унаследовано от Task)
Start(TaskScheduler)

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

(Унаследовано от Task)
ToString()

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

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

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

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

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

(Унаследовано от Task)
Wait(Int32, CancellationToken)

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

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

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

(Унаследовано от Task)
Wait(TimeSpan, CancellationToken)

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

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

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

(Унаследовано от Task)
WaitAsync(CancellationToken)

Возвращает значение Task<TResult> , которое завершится, когда это Task<TResult> завершится или когда указан CancellationToken запрос на отмену.

WaitAsync(TimeSpan, CancellationToken)

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

WaitAsync(TimeSpan, TimeProvider, CancellationToken)

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

WaitAsync(TimeSpan, TimeProvider)

Получает значение Task<TResult> , которое завершится, когда это Task<TResult> завершится или когда истекает указанное время ожидания.

WaitAsync(TimeSpan)

Получает значение Task<TResult> , которое завершится, когда это Task<TResult> завершится или когда истекает указанное время ожидания.

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

Имя Описание
IAsyncResult.AsyncWaitHandle

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

(Унаследовано от Task)
IAsyncResult.CompletedSynchronously

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

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

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

Имя Описание
AsAsyncAction(Task)

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

AsAsyncOperation<TResult>(Task<TResult>)

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

DispatcherOperationWait(Task, TimeSpan)

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

DispatcherOperationWait(Task)

Ожидает бесконечного завершения базовой DispatcherOperation базы данных.

IsDispatcherOperationTask(Task)

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

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

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

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

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