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 метода и обрабатываются блоком/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
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 завершилась успешно или еще не создала ни одного исключения, возвращает значение |
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>) |
Ставит в очередь указанную работу для запуска в пуле потоков и возвращает прокси для задачи, возвращаемой функцией |
Run(Func<Task>, CancellationToken) |
Ставит в очередь указанную работу для запуска в пуле потоков и возвращает прокси для задачи, возвращаемой функцией |
Run<TResult>(Func<Task<TResult>>) |
Ставит в очередь заданную работу для запуска в пуле потоков и возвращает прокси для задачи |
Run<TResult>(Func<Task<TResult>>, CancellationToken) |
Ставит в очередь заданную работу для запуска в пуле потоков и возвращает прокси для задачи |
Run<TResult>(Func<TResult>) |
Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task<TResult>, представляющий эту работу. Токен отмены позволяет отменить задачу, если она не была начата. |
Run<TResult>(Func<TResult>, CancellationToken) |
Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект |
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(), являются потокобезопасными и могут использоваться из нескольких потоков одновременно.