Task Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Representa uma operação assíncrona.
public ref class Task : IAsyncResult
public ref class Task : IAsyncResult, IDisposable
public class Task : IAsyncResult
public class Task : IAsyncResult, IDisposable
type Task = class
interface IAsyncResult
type Task = class
interface IAsyncResult
interface IDisposable
Public Class Task
Implements IAsyncResult
Public Class Task
Implements IAsyncResult, IDisposable
- Herança
-
Task
- Derivado
- Implementações
Observações
A Task classe representa uma única operação que não retorna um valor e que geralmente é executada de forma assíncrona. Task Os objetos são um dos componentes centrais do padrão assíncrono baseado em tarefas. Como o trabalho executado por um Task objeto normalmente é executado assincronamente numa thread do pool de threads em vez de sincronamente na thread principal da aplicação, é possível usar a propriedade Status, bem como as propriedades IsCanceled, IsCompleted e IsFaulted para determinar o estado de uma tarefa. Mais comumente, uma expressão lambda é usada para especificar o trabalho que a tarefa deve executar.
Para operações que retornam valores, use a Task<TResult> classe.
Instanciação de tarefas
O exemplo a seguir cria e executa quatro tarefas. Três tarefas executam um Action<T> delegado chamado action, que aceita um argumento do tipo Object. Uma quarta tarefa executa uma expressão lambda (um Action delegado) que é definida inline na chamada para o método de criação de tarefa. Cada tarefa é instanciada e executada de uma maneira diferente:
A tarefa
t1é instanciada ao chamar um construtor da classe Task, mas é iniciada chamando o seu método Start() somente depois de a tarefat2estar iniciada.A tarefa
t2é instanciada e iniciada em uma única chamada de método chamando o TaskFactory.StartNew(Action<Object>, Object) método.A tarefa
t3é instanciada e iniciada em uma única chamada de método chamando o Run(Action) método.A tarefa
t4é executada de forma síncrona no thread principal chamando o RunSynchronously() método.
Como a tarefa t4 é executada de forma síncrona, ela é executada no thread principal do aplicativo. Normalmente, as tarefas restantes são executadas de forma assíncrona em um ou mais threads de um pool de threads.
using System;
using System.Threading;
using System.Threading.Tasks;
class Example
{
static void Main()
{
Action<object> action = (object obj) =>
{
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, obj,
Thread.CurrentThread.ManagedThreadId);
};
// Create a task but do not start it.
Task t1 = new Task(action, "alpha");
// Construct a started task
Task t2 = Task.Factory.StartNew(action, "beta");
// Block the main thread to demonstrate that t2 is executing
t2.Wait();
// Launch t1
t1.Start();
Console.WriteLine("t1 has been launched. (Main Thread={0})",
Thread.CurrentThread.ManagedThreadId);
// Wait for the task to finish.
t1.Wait();
// Construct a started task using Task.Run.
String taskData = "delta";
Task t3 = Task.Run( () => {Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, taskData,
Thread.CurrentThread.ManagedThreadId);
});
// Wait for the task to finish.
t3.Wait();
// Construct an unstarted task
Task t4 = new Task(action, "gamma");
// Run it synchronously
t4.RunSynchronously();
// Although the task was run synchronously, it is a good practice
// to wait for it in the event exceptions were thrown by the task.
t4.Wait();
}
}
// The example displays output like the following:
// Task=1, obj=beta, Thread=3
// t1 has been launched. (Main Thread=1)
// Task=2, obj=alpha, Thread=4
// Task=3, obj=delta, Thread=3
// Task=4, obj=gamma, Thread=1
open System.Threading
open System.Threading.Tasks
let action =
fun (obj: obj) -> printfn $"Task={Task.CurrentId}, obj={obj}, Thread={Thread.CurrentThread.ManagedThreadId}"
// Create a task but do not start it.
let t1 = new Task(action, "alpha")
// Construct a started task
let t2 = Task.Factory.StartNew(action, "beta")
// Block the main thread to demonstrate that t2 is executing
t2.Wait()
// Launch t1
t1.Start()
printfn $"t1 has been launched. (Main Thread={Thread.CurrentThread.ManagedThreadId})"
// Wait for the task to finish.
t1.Wait()
// Construct a started task using Task.Run.
let taskData = "delta"
let t3 =
Task.Run(fun () -> printfn $"Task={Task.CurrentId}, obj={taskData}, Thread={Thread.CurrentThread.ManagedThreadId}")
// Wait for the task to finish.
t3.Wait()
// Construct an unstarted task
let t4 = new Task(action, "gamma")
// Run it synchronously
t4.RunSynchronously()
// Although the task was run synchronously, it is a good practice
// to wait for it in the event exceptions were thrown by the task.
t4.Wait()
// The example displays output like the following:
// Task=1, obj=beta, Thread=3
// t1 has been launched. (Main Thread=1)
// Task=2, obj=alpha, Thread=4
// Task=3, obj=delta, Thread=3
// Task=4, obj=gamma, Thread=1
Imports System.Threading
Imports System.Threading.Tasks
Module Example2
Public Sub Main()
Dim action As Action(Of Object) =
Sub(obj As Object)
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, obj,
Thread.CurrentThread.ManagedThreadId)
End Sub
' Construct an unstarted task
Dim t1 As New Task(action, "alpha")
' Construct a started task
Dim t2 As Task = Task.Factory.StartNew(action, "beta")
' Block the main thread to demonstrate that t2 is executing
t2.Wait()
' Launch t1
t1.Start()
Console.WriteLine("t1 has been launched. (Main Thread={0})",
Thread.CurrentThread.ManagedThreadId)
' Wait for the task to finish.
t1.Wait()
' Construct a started task using Task.Run.
Dim taskData As String = "delta"
Dim t3 As Task = Task.Run(Sub()
Console.WriteLine("Task={0}, obj={1}, Thread={2}",
Task.CurrentId, taskData,
Thread.CurrentThread.ManagedThreadId)
End Sub)
' Wait for the task to finish.
t3.Wait()
' Construct an unstarted task
Dim t4 As New Task(action, "gamma")
' Run it synchronously
t4.RunSynchronously()
' Although the task was run synchronously, it is a good practice
' to wait for it in the event exceptions were thrown by the task.
t4.Wait()
End Sub
End Module
' The example displays output like the following:
' Task=1, obj=beta, Thread=3
' t1 has been launched. (Main Thread=1)
' Task=2, obj=alpha, Thread=3
' Task=3, obj=delta, Thread=3
' Task=4, obj=gamma, Thread=1
Criar e executar uma tarefa
Você pode criar Task instâncias de várias maneiras. A abordagem mais comum é chamar o método estático Run . O Run método fornece uma maneira simples de iniciar uma tarefa usando valores padrão e sem exigir parâmetros adicionais. O exemplo a seguir usa o Run(Action) método para iniciar uma tarefa que faz loops e, em seguida, exibe o número de iterações de loop:
using System;
using System.Threading.Tasks;
public class Example
{
public static async Task Main()
{
await Task.Run( () => {
// Just loop.
int ctr = 0;
for (ctr = 0; ctr <= 1000000; ctr++)
{}
Console.WriteLine("Finished {0} loop iterations",
ctr);
} );
}
}
// The example displays the following output:
// Finished 1000001 loop iterations
open System.Threading.Tasks
let main =
task {
do!
Task.Run(fun () ->
for i = 0 to 1000000 do
printfn $"Finished {i} loop iterations")
}
main.Wait()
// The example displays the following output:
// Finished 1000001 loop iterations
Imports System.Threading.Tasks
Module Example1
Public Sub Main()
Dim t As Task = Task.Run(Sub()
' Just loop.
Dim ctr As Integer = 0
For ctr = 0 To 1000000
Next
Console.WriteLine("Finished {0} loop iterations",
ctr)
End Sub)
t.Wait()
End Sub
End Module
' The example displays the following output:
' Finished 1000001 loop iterations
Uma alternativa é o método estático TaskFactory.StartNew . A Task.Factory propriedade retorna um TaskFactory objeto. As sobrecargas do método TaskFactory.StartNew permitem especificar parâmetros para passar para as opções de criação de tarefas e um agendador de tarefas. O exemplo a seguir usa o TaskFactory.StartNew método para iniciar uma tarefa. É funcionalmente equivalente ao código no exemplo anterior.
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Task t = Task.Factory.StartNew( () => {
// Just loop.
int ctr = 0;
for (ctr = 0; ctr <= 1000000; ctr++)
{}
Console.WriteLine("Finished {0} loop iterations",
ctr);
} );
t.Wait();
}
}
// The example displays the following output:
// Finished 1000001 loop iterations
open System.Threading.Tasks
let t =
Task.Factory.StartNew(fun () ->
// Just loop.
for i = 0 to 1000000 do
printfn $"Finished {i} loop iterations")
t.Wait()
// The example displays the following output:
// Finished 1000001 loop iterations
Imports System.Threading.Tasks
Module Example3
Public Sub Main()
Dim t As Task = Task.Factory.StartNew(Sub()
' Just loop.
Dim ctr As Integer = 0
For ctr = 0 To 1000000
Next
Console.WriteLine("Finished {0} loop iterations",
ctr)
End Sub)
t.Wait()
End Sub
End Module
' The example displays the following output:
' Finished 1000001 loop iterations
Para obter exemplos mais completos, consulte Programação assíncrona baseada em tarefas.
Criação e execução de tarefas separadas
A Task classe também fornece construtores que inicializam a tarefa, mas que não a agendam para execução. Por motivos de desempenho, o método Task.Run ou o método TaskFactory.StartNew são os mecanismos preferidos para criar e agendar tarefas computacionais, mas para cenários em que a criação e o agendamento devem ser separados, pode-se usar os construtores e, em seguida, chamar o método Task.Start para agendar a tarefa para execução em um momento posterior.
Aguarde a conclusão de uma tarefa
Como as tarefas normalmente são executadas de forma assíncrona em um thread do pool de threads, o thread que cria e inicia a tarefa continua a execução assim que a tarefa é instanciada. Em alguns casos, quando o thread de chamada é o thread principal do aplicativo, o aplicativo pode ser encerrado antes que a tarefa realmente comece a ser executada. Em outros, a lógica do aplicativo pode exigir que o thread de chamada continue a execução somente quando uma ou mais tarefas tiverem concluído a execução. Você pode sincronizar a execução do thread de chamada e as tarefas assíncronas iniciadas chamando um Wait método para aguardar a conclusão de uma ou mais tarefas.
Para aguardar a conclusão de uma única tarefa, você pode chamar seu Task.Wait método. Uma chamada para o Wait método bloqueia o thread de chamada até que a instância de classe única tenha concluído a execução.
O exemplo a seguir chama o método parameterless Wait() para aguardar incondicionalmente até que uma tarefa seja concluída. A tarefa simula o trabalho chamando o Thread.Sleep método para dormir por dois segundos.
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static Random rand = new Random();
static void Main()
{
// Wait on a single task with no timeout specified.
Task taskA = Task.Run( () => Thread.Sleep(2000));
Console.WriteLine("taskA Status: {0}", taskA.Status);
try {
taskA.Wait();
Console.WriteLine("taskA Status: {0}", taskA.Status);
}
catch (AggregateException) {
Console.WriteLine("Exception in taskA.");
}
}
}
// The example displays output like the following:
// taskA Status: WaitingToRun
// taskA Status: RanToCompletion
open System
open System.Threading
open System.Threading.Tasks
let rand = Random()
// Wait on a single task with no timeout specified.
let taskA = Task.Run(fun () -> Thread.Sleep 2000)
printfn $"taskA Status: {taskA.Status}"
try
taskA.Wait()
printfn $"taskA Status: {taskA.Status}"
with :? AggregateException ->
printfn "Exception in taskA."
// The example displays output like the following:
// taskA Status: WaitingToRun
// taskA Status: RanToCompletion
Imports System.Threading
Imports System.Threading.Tasks
Module Example4
Public Sub Main()
' Wait on a single task with no timeout specified.
Dim taskA = Task.Run(Sub() Thread.Sleep(2000))
Console.WriteLine("taskA Status: {0}", taskA.Status)
Try
taskA.Wait()
Console.WriteLine("taskA Status: {0}", taskA.Status)
Catch e As AggregateException
Console.WriteLine("Exception in taskA.")
End Try
End Sub
End Module
' The example displays output like the following:
' taskA Status: WaitingToRun
' taskA Status: RanToCompletion
Você também pode aguardar condicionalmente a conclusão de uma tarefa. Os métodos Wait(Int32) e Wait(TimeSpan) bloqueiam o thread que faz a chamada até que a tarefa termine ou o tempo limite seja alcançado, o que ocorrer primeiro. Como o exemplo a seguir inicia uma tarefa que permanece suspensa por dois segundos, mas define um valor de tempo limite de um segundo, o thread de chamada bloqueia até que o tempo limite expire e antes que a tarefa tenha concluído a execução.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
// Wait on a single task with a timeout specified.
Task taskA = Task.Run( () => Thread.Sleep(2000));
try {
taskA.Wait(1000); // Wait for 1 second.
bool completed = taskA.IsCompleted;
Console.WriteLine("Task A completed: {0}, Status: {1}",
completed, taskA.Status);
if (!completed)
Console.WriteLine("Timed out before task A completed.");
}
catch (AggregateException) {
Console.WriteLine("Exception in taskA.");
}
}
}
// The example displays output like the following:
// Task A completed: False, Status: Running
// Timed out before task A completed.
open System
open System.Threading
open System.Threading.Tasks
// Wait on a single task with a timeout specified.
let taskA = Task.Run(fun () -> Thread.Sleep 2000)
try
taskA.Wait 1000 |> ignore // Wait for 1 second.
let completed = taskA.IsCompleted
printfn $"Task A completed: {completed}, Status: {taskA.Status}"
if not completed then
printfn "Timed out before task A completed."
with :? AggregateException ->
printfn "Exception in taskA."
// The example displays output like the following:
// Task A completed: False, Status: Running
// Timed out before task A completed.
Imports System.Threading
Imports System.Threading.Tasks
Module Example5
Public Sub Main()
' Wait on a single task with a timeout specified.
Dim taskA As Task = Task.Run(Sub() Thread.Sleep(2000))
Try
taskA.Wait(1000) ' Wait for 1 second.
Dim completed As Boolean = taskA.IsCompleted
Console.WriteLine("Task.Completed: {0}, Status: {1}",
completed, taskA.Status)
If Not completed Then
Console.WriteLine("Timed out before task A completed.")
End If
Catch e As AggregateException
Console.WriteLine("Exception in taskA.")
End Try
End Sub
End Module
' The example displays the following output:
' Task A completed: False, Status: Running
' Timed out before task A completed.
Você também pode fornecer um token de cancelamento chamando os métodos Wait(CancellationToken) e Wait(Int32, CancellationToken). Se a propriedade do token IsCancellationRequested for true ou se tornar true enquanto o método Wait estiver em execução, o método lançará um OperationCanceledException.
Em alguns casos, você pode querer esperar que a primeira de uma série de tarefas em execução seja concluída, mas não se importa com qual tarefa é. Para isso, você pode chamar uma das sobrecargas do Task.WaitAny método. O exemplo a seguir cria três tarefas, cada uma das quais permanece suspensa por um intervalo determinado por um gerador de números aleatórios. O WaitAny(Task[]) método aguarda a conclusão da primeira tarefa. O exemplo exibe informações sobre o status das três tarefas.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var tasks = new Task[3];
var rnd = new Random();
for (int ctr = 0; ctr <= 2; ctr++)
tasks[ctr] = Task.Run( () => Thread.Sleep(rnd.Next(500, 3000)));
try {
int index = Task.WaitAny(tasks);
Console.WriteLine("Task #{0} completed first.\n", tasks[index].Id);
Console.WriteLine("Status of all tasks:");
foreach (var t in tasks)
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status);
}
catch (AggregateException) {
Console.WriteLine("An exception occurred.");
}
}
}
// The example displays output like the following:
// Task #1 completed first.
//
// Status of all tasks:
// Task #3: Running
// Task #1: RanToCompletion
// Task #4: Running
open System
open System.Threading
open System.Threading.Tasks
let rnd = new Random()
let tasks =
[| for _ = 0 to 2 do
Task.Run(fun () -> rnd.Next(500, 3000) |> Thread.Sleep) |]
try
let index = Task.WaitAny tasks
printfn $"Task #{tasks[index].Id} completed first.\n"
printfn "Status of all tasks:"
for t in tasks do
printfn $" Task #{t.Id}: {t.Status}"
with :? AggregateException ->
printfn "An exception occurred."
// The example displays output like the following:
// Task #1 completed first.
//
// Status of all tasks:
// Task #3: Running
// Task #1: RanToCompletion
// Task #4: Running
Imports System.Threading
Imports System.Threading.Tasks
Module Example8
Public Sub Main()
Dim tasks(2) As Task
Dim rnd As New Random()
For ctr As Integer = 0 To 2
tasks(ctr) = Task.Run(Sub() Thread.Sleep(rnd.Next(500, 3000)))
Next
Try
Dim index As Integer = Task.WaitAny(tasks)
Console.WriteLine("Task #{0} completed first.", tasks(index).Id)
Console.WriteLine()
Console.WriteLine("Status of all tasks:")
For Each t In tasks
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status)
Next
Catch e As AggregateException
Console.WriteLine("An exception occurred.")
End Try
End Sub
End Module
' The example displays output like the following:
' Task #1 completed first.
'
' Status of all tasks:
' Task #3: Running
' Task #1: RanToCompletion
' Task #4: Running
Você também pode aguardar a conclusão de uma série de tarefas chamando o WaitAll método. O exemplo a seguir cria dez tarefas, aguarda a conclusão de todas as dez e exibe seu status.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
// Wait for all tasks to complete.
Task[] tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
tasks[i] = Task.Run(() => Thread.Sleep(2000));
}
try {
Task.WaitAll(tasks);
}
catch (AggregateException ae) {
Console.WriteLine("One or more exceptions occurred: ");
foreach (var ex in ae.Flatten().InnerExceptions)
Console.WriteLine(" {0}", ex.Message);
}
Console.WriteLine("Status of completed tasks:");
foreach (var t in tasks)
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status);
}
}
// The example displays the following output:
// Status of completed tasks:
// Task #2: RanToCompletion
// Task #1: RanToCompletion
// Task #3: RanToCompletion
// Task #4: RanToCompletion
// Task #6: RanToCompletion
// Task #5: RanToCompletion
// Task #7: RanToCompletion
// Task #8: RanToCompletion
// Task #9: RanToCompletion
// Task #10: RanToCompletion
open System
open System.Threading
open System.Threading.Tasks
// Wait for all tasks to complete.
let tasks =
[| for _ = 0 to 9 do
Task.Run(fun () -> Thread.Sleep 2000) |]
try
Task.WaitAll tasks
with :? AggregateException as ae ->
printfn "One or more exceptions occurred: "
for ex in ae.Flatten().InnerExceptions do
printfn $" {ex.Message}"
printfn "Status of completed tasks:"
for t in tasks do
printfn $" Task #{t.Id}: {t.Status}"
// The example displays the following output:
// Status of completed tasks:
// Task #2: RanToCompletion
// Task #1: RanToCompletion
// Task #3: RanToCompletion
// Task #4: RanToCompletion
// Task #6: RanToCompletion
// Task #5: RanToCompletion
// Task #7: RanToCompletion
// Task #8: RanToCompletion
// Task #9: RanToCompletion
// Task #10: RanToCompletion
Imports System.Threading
Imports System.Threading.Tasks
Module Example6
Public Sub Main()
' Wait for all tasks to complete.
Dim tasks(9) As Task
For i As Integer = 0 To 9
tasks(i) = Task.Run(Sub() Thread.Sleep(2000))
Next
Try
Task.WaitAll(tasks)
Catch ae As AggregateException
Console.WriteLine("One or more exceptions occurred: ")
For Each ex In ae.Flatten().InnerExceptions
Console.WriteLine(" {0}", ex.Message)
Next
End Try
Console.WriteLine("Status of completed tasks:")
For Each t In tasks
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status)
Next
End Sub
End Module
' The example displays the following output:
' Status of completed tasks:
' Task #2: RanToCompletion
' Task #1: RanToCompletion
' Task #3: RanToCompletion
' Task #4: RanToCompletion
' Task #6: RanToCompletion
' Task #5: RanToCompletion
' Task #7: RanToCompletion
' Task #8: RanToCompletion
' Task #9: RanToCompletion
' Task #10: RanToCompletion
Observe que quando você aguarda a conclusão de uma ou mais tarefas, todas as exceções lançadas nas tarefas em execução são propagadas no thread que chama o Wait método, como mostra o exemplo a seguir. Ele lança 12 tarefas, três delas são concluídas normalmente e três geram uma exceção. Das seis tarefas restantes, três são canceladas antes de começarem e três são canceladas durante a execução. As exceções são lançadas na chamada do método WaitAll e são tratadas por um bloco try/catch.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
// Create a cancellation token and cancel it.
var source1 = new CancellationTokenSource();
var token1 = source1.Token;
source1.Cancel();
// Create a cancellation token for later cancellation.
var source2 = new CancellationTokenSource();
var token2 = source2.Token;
// Create a series of tasks that will complete, be cancelled,
// timeout, or throw an exception.
Task[] tasks = new Task[12];
for (int i = 0; i < 12; i++)
{
switch (i % 4)
{
// Task should run to completion.
case 0:
tasks[i] = Task.Run(() => Thread.Sleep(2000));
break;
// Task should be set to canceled state.
case 1:
tasks[i] = Task.Run( () => Thread.Sleep(2000),
token1);
break;
case 2:
// Task should throw an exception.
tasks[i] = Task.Run( () => { throw new NotSupportedException(); } );
break;
case 3:
// Task should examine cancellation token.
tasks[i] = Task.Run( () => { Thread.Sleep(2000);
if (token2.IsCancellationRequested)
token2.ThrowIfCancellationRequested();
Thread.Sleep(500); }, token2);
break;
}
}
Thread.Sleep(250);
source2.Cancel();
try {
Task.WaitAll(tasks);
}
catch (AggregateException ae) {
Console.WriteLine("One or more exceptions occurred:");
foreach (var ex in ae.InnerExceptions)
Console.WriteLine(" {0}: {1}", ex.GetType().Name, ex.Message);
}
Console.WriteLine("\nStatus of tasks:");
foreach (var t in tasks) {
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status);
if (t.Exception != null) {
foreach (var ex in t.Exception.InnerExceptions)
Console.WriteLine(" {0}: {1}", ex.GetType().Name,
ex.Message);
}
}
}
}
// The example displays output like the following:
// One or more exceptions occurred:
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
//
// Status of tasks:
// Task #13: RanToCompletion
// Task #1: Canceled
// Task #3: Faulted
// NotSupportedException: Specified method is not supported.
// Task #8: Canceled
// Task #14: RanToCompletion
// Task #4: Canceled
// Task #6: Faulted
// NotSupportedException: Specified method is not supported.
// Task #7: Canceled
// Task #15: RanToCompletion
// Task #9: Canceled
// Task #11: Faulted
// NotSupportedException: Specified method is not supported.
// Task #12: Canceled
open System
open System.Threading
open System.Threading.Tasks
// Create a cancellation token and cancel it.
let source1 = new CancellationTokenSource()
let token1 = source1.Token
source1.Cancel()
// Create a cancellation token for later cancellation.
let source2 = new CancellationTokenSource()
let token2 = source2.Token
// Create a series of tasks that will complete, be cancelled,
// timeout, or throw an exception.
let tasks =
[| for i in 0..11 do
match i % 4 with
// Task should run to completion.
| 0 -> Task.Run(fun () -> Thread.Sleep 2000)
// Task should be set to canceled state.
| 1 -> Task.Run(fun () -> Thread.Sleep 2000, token1)
// Task should throw an exception.
| 2 -> Task.Run(fun () -> NotSupportedException())
// Task should examine cancellation token.
| _ ->
Task.Run(fun () ->
Thread.Sleep 2000
if token2.IsCancellationRequested then
token2.ThrowIfCancellationRequested()
Thread.Sleep 500, token2) |]
Thread.Sleep 250
source2.Cancel()
try
Task.WaitAll tasks
with :? AggregateException as ae ->
printfn "One or more exceptions occurred:"
for ex in ae.InnerExceptions do
printfn $" {ex.GetType().Name}: {ex.Message}"
printfn "\nStatus of tasks:"
for t in tasks do
printfn $" Task #{t.Id}: {t.Status}"
if isNull t.Exception |> not then
for ex in t.Exception.InnerExceptions do
printfn $" {ex.GetType().Name}: {ex.Message}"
// The example displays output like the following:
// One or more exceptions occurred:
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
// TaskCanceledException: A task was canceled.
// NotSupportedException: Specified method is not supported.
// TaskCanceledException: A task was canceled.
//
// Status of tasks:
// Task #13: RanToCompletion
// Task #1: Canceled
// Task #3: Faulted
// NotSupportedException: Specified method is not supported.
// Task #8: Canceled
// Task #14: RanToCompletion
// Task #4: Canceled
// Task #6: Faulted
// NotSupportedException: Specified method is not supported.
// Task #7: Canceled
// Task #15: RanToCompletion
// Task #9: Canceled
// Task #11: Faulted
// NotSupportedException: Specified method is not supported.
// Task #12: Canceled
Imports System.Threading
Imports System.Threading.Tasks
Module Example7
Public Sub Main()
' Create a cancellation token and cancel it.
Dim source1 As New CancellationTokenSource()
Dim token1 As CancellationToken = source1.Token
source1.Cancel()
' Create a cancellation token for later cancellation.
Dim source2 As New CancellationTokenSource()
Dim token2 As CancellationToken = source2.Token
' Create a series of tasks that will complete, be cancelled,
' timeout, or throw an exception.
Dim tasks(11) As Task
For i As Integer = 0 To 11
Select Case i Mod 4
' Task should run to completion.
Case 0
tasks(i) = Task.Run(Sub() Thread.Sleep(2000))
' Task should be set to canceled state.
Case 1
tasks(i) = Task.Run(Sub() Thread.Sleep(2000), token1)
Case 2
' Task should throw an exception.
tasks(i) = Task.Run(Sub()
Throw New NotSupportedException()
End Sub)
Case 3
' Task should examine cancellation token.
tasks(i) = Task.Run(Sub()
Thread.Sleep(2000)
If token2.IsCancellationRequested Then
token2.ThrowIfCancellationRequested()
End If
Thread.Sleep(500)
End Sub, token2)
End Select
Next
Thread.Sleep(250)
source2.Cancel()
Try
Task.WaitAll(tasks)
Catch ae As AggregateException
Console.WriteLine("One or more exceptions occurred:")
For Each ex In ae.InnerExceptions
Console.WriteLine(" {0}: {1}", ex.GetType().Name, ex.Message)
Next
End Try
Console.WriteLine()
Console.WriteLine("Status of tasks:")
For Each t In tasks
Console.WriteLine(" Task #{0}: {1}", t.Id, t.Status)
If t.Exception IsNot Nothing Then
For Each ex In t.Exception.InnerExceptions
Console.WriteLine(" {0}: {1}", ex.GetType().Name,
ex.Message)
Next
End If
Next
End Sub
End Module
' The example displays output like the following:
' One or more exceptions occurred:
' TaskCanceledException: A task was canceled.
' NotSupportedException: Specified method is not supported.
' TaskCanceledException: A task was canceled.
' TaskCanceledException: A task was canceled.
' NotSupportedException: Specified method is not supported.
' TaskCanceledException: A task was canceled.
' TaskCanceledException: A task was canceled.
' NotSupportedException: Specified method is not supported.
' TaskCanceledException: A task was canceled.
'
' Status of tasks:
' Task #13: RanToCompletion
' Task #1: Canceled
' Task #3: Faulted
' NotSupportedException: Specified method is not supported.
' Task #8: Canceled
' Task #14: RanToCompletion
' Task #4: Canceled
' Task #6: Faulted
' NotSupportedException: Specified method is not supported.
' Task #7: Canceled
' Task #15: RanToCompletion
' Task #9: Canceled
' Task #11: Faulted
' NotSupportedException: Specified method is not supported.
' Task #12: Canceled
Para obter mais informações sobre o tratamento de exceções em operações assíncronas baseadas em tarefas, consulte Tratamento de exceções.
Tarefas e cultura
Começando com aplicações de desktop que têm como alvo o .NET Framework 4.6, a cultura do thread que cria e invoca uma tarefa torna-se parte integrante do contexto do thread. Ou seja, independentemente da cultura atual do thread no qual a tarefa é executada, a cultura atual da tarefa é a cultura do thread chamador. Para aplicativos destinados a versões do .NET Framework anteriores ao .NET Framework 4.6, a cultura da tarefa é a cultura do thread no qual a tarefa é executada. Para obter mais informações, consulte a seção "Cultura e operações assíncronas baseadas em tarefas" no CultureInfo tópico .
Note
Os aplicativos da Store seguem o Tempo de Execução do Windows na configuração e obtenção da cultura padrão.
Para desenvolvedores de depuradores
Para desenvolvedores que implementam depuradores personalizados, vários membros internos e privados da tarefa podem ser úteis (estes podem mudar de versão para versão). O m_taskId campo serve como armazenamento de suporte para a Id propriedade, no entanto, acessar esse campo diretamente de um depurador pode ser mais eficiente do que acessar o mesmo valor por meio do método getter da propriedade (o s_taskIdCounter contador é usado para recuperar a próxima ID disponível para uma tarefa). Da mesma forma, o campo m_stateFlags armazena informações sobre o estágio atual do ciclo de vida da tarefa, estas também acessíveis através da propriedade Status. O m_action campo armazena uma referência ao delegado da tarefa e o campo armazena m_stateObject o estado assíncrono passado para a tarefa pelo desenvolvedor. Finalmente, para depuradores que analisam quadros de pilha, o InternalWait método serve como um marcador potencial para quando uma tarefa está entrando em uma operação de espera.
Construtores
| Name | Descrição |
|---|---|
| Task(Action, CancellationToken, TaskCreationOptions) |
Inicializa um novo Task com as opções de ação e criação especificadas. |
| Task(Action, CancellationToken) |
Inicializa um novo Task com a ação especificada e CancellationToken. |
| Task(Action, TaskCreationOptions) |
Inicializa um novo Task com as opções de ação e criação especificadas. |
| Task(Action) |
Inicializa um novo Task com a ação especificada. |
| Task(Action<Object>, Object, CancellationToken, TaskCreationOptions) |
Inicializa um novo Task com a ação, estado e opções especificados. |
| Task(Action<Object>, Object, CancellationToken) |
Inicializa um novo Task com a ação, estado e CancellationToken. especificados. |
| Task(Action<Object>, Object, TaskCreationOptions) |
Inicializa um novo Task com a ação, estado e opções especificados. |
| Task(Action<Object>, Object) |
Inicializa um novo Task com a ação e o estado especificados. |
Propriedades
| Name | Descrição |
|---|---|
| AsyncState |
Recebe o objeto de estado fornecido quando foi criado Task , ou nulo se não tiver sido fornecido. |
| CompletedTask |
Recebe uma tarefa que já foi concluída com sucesso. |
| CreationOptions |
É o TaskCreationOptions que se usa para criar esta tarefa. |
| CurrentId |
Devolve o ID do que está a executar Taskatualmente . |
| Exception |
Obtém o AggregateException que causou o Task fim prematuro. Se o Task completar com sucesso ou ainda não tiver lançado exceções, isto devolverá |
| Factory |
Fornece acesso a métodos de fábrica para criar e configurar Task instâncias Task<TResult> . |
| Id |
Obtém um ID para este Task caso. |
| IsCanceled |
Percebe se esta Task instância concluiu a execução devido ao cancelamento. |
| IsCompleted |
Recebe um valor que indica se a tarefa foi concluída. |
| IsCompletedSuccessfully |
Percebe se a tarefa foi concluída. |
| IsFaulted |
Obtém se o Task concluído devido a uma exceção não tratada. |
| Status |
Percebe TaskStatus esta tarefa. |
Métodos
| Name | Descrição |
|---|---|
| ConfigureAwait(Boolean) |
Configura um awaiter usado para aguardar isto Task. |
| ConfigureAwait(ConfigureAwaitOptions) |
Configura um awaiter usado para aguardar isto Task. |
| ContinueWith(Action<Task,Object>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Cria uma continuação que recebe informação de estado fornecida pelo chamador e um token de cancelamento, que é executada quando o destino Task é concluído. A continuação é executada com base num conjunto de condições especificadas e utiliza um agendador especificado. |
| ContinueWith(Action<Task,Object>, Object, CancellationToken) |
Cria uma continuação que recebe informação de estado fornecida pelo chamador e um token de cancelamento, e que é executada de forma assíncrona quando o destino Task termina. |
| ContinueWith(Action<Task,Object>, Object, TaskContinuationOptions) |
Cria uma continuação que recebe informações de estado fornecidas pelo chamador e executa-se quando o destino Task termina. A continuação é executada com base num conjunto de condições especificadas. |
| ContinueWith(Action<Task,Object>, Object, TaskScheduler) |
Cria uma continuação que recebe informação de estado fornecida pelo chamador e executa assíncrona quando o destino Task termina. A continuação utiliza um escalonador especificado. |
| ContinueWith(Action<Task,Object>, Object) |
Cria uma continuação que recebe informações de estado fornecidas pelo chamador e executa-se quando o destino Task termina. |
| ContinueWith(Action<Task>, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Cria uma continuação que se executa quando a tarefa-alvo compete de acordo com o especificado TaskContinuationOptions. A continuação recebe um token de cancelamento e utiliza um escalonador especificado. |
| ContinueWith(Action<Task>, CancellationToken) |
Cria uma continuação que recebe um token de cancelamento e executa assíncronamente quando o destino Task é concluído. |
| ContinueWith(Action<Task>, TaskContinuationOptions) |
Cria uma continuação que se executa quando a tarefa alvo é concluída de acordo com o especificado TaskContinuationOptions. |
| ContinueWith(Action<Task>, TaskScheduler) |
Cria uma continuação que é executada assíncrona quando o destino Task termina. A continuação utiliza um escalonador especificado. |
| ContinueWith(Action<Task>) |
Cria uma continuação que é executada assíncrona quando o destino Task termina. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Cria uma continuação que é executada com base nas opções de continuação de tarefa especificadas quando o destino Task é concluído e devolve um valor. A continuação recebe informações de estado fornecidas pelo chamador e um token de cancelamento, utilizando o escalonador especificado. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken) |
Cria uma continuação que se executa assíncrona quando o destino Task termina e devolve um valor. A continuação recebe informações de estado fornecidas pelo chamador e um token de cancelamento. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskContinuationOptions) |
Cria uma continuação que é executada com base nas opções de continuação da tarefa especificadas quando o destino Task é concluído. A continuação recebe informações de estado fornecidas pelo chamador. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskScheduler) |
Cria uma continuação que é executada assíncrona quando o destino Task termina. A continuação recebe informações de estado fornecidas pelo chamador e utiliza um agendador especificado. |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object) |
Cria uma continuação que recebe informação de estado fornecida pelo chamador e executa assíncronamente quando o destino Task termina e devolve um valor. |
| ContinueWith<TResult>(Func<Task,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Cria uma continuação que se executa de acordo com as opções de continuação especificadas e devolve um valor. A continuação recebe um token de cancelamento e utiliza um escalonador especificado. |
| ContinueWith<TResult>(Func<Task,TResult>, CancellationToken) |
Cria uma continuação que se executa assíncrona quando o destino Task termina e devolve um valor. A continuação recebe um token de cancelamento. |
| ContinueWith<TResult>(Func<Task,TResult>, TaskContinuationOptions) |
Cria uma continuação que se executa de acordo com as opções de continuação especificadas e devolve um valor. |
| ContinueWith<TResult>(Func<Task,TResult>, TaskScheduler) |
Cria uma continuação que se executa assíncrona quando o destino Task termina e devolve um valor. A continuação utiliza um escalonador especificado. |
| ContinueWith<TResult>(Func<Task,TResult>) |
Cria uma continuação que se executa assíncrona quando o destino Task<TResult> termina e devolve um valor. |
| Delay(Int32, CancellationToken) |
Cria uma tarefa cancelável que se completa após um número especificado de milissegundos. |
| Delay(Int32) |
Cria uma tarefa que se completa após um número especificado de milissegundos. |
| Delay(TimeSpan, CancellationToken) |
Cria uma tarefa cancelável que é concluída após um intervalo de tempo especificado. |
| Delay(TimeSpan, TimeProvider, CancellationToken) |
Cria uma tarefa cancelável que é concluída após um intervalo de tempo especificado. |
| Delay(TimeSpan, TimeProvider) |
Cria uma tarefa que é concluída após um intervalo de tempo especificado. |
| Delay(TimeSpan) |
Cria uma tarefa que é concluída após um intervalo de tempo especificado. |
| Dispose() |
Liberta todos os recursos usados pela instância atual da Task classe. |
| Dispose(Boolean) |
Elimina o Task, libertando todos os seus recursos não geridos. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| FromCanceled(CancellationToken) |
Cria um Task que é concluído devido ao cancelamento com um token de cancelamento especificado. |
| FromCanceled<TResult>(CancellationToken) |
Cria um Task<TResult> que é concluído devido ao cancelamento com um token de cancelamento especificado. |
| FromException(Exception) |
Cria um Task que terminou com uma exceção especificada. |
| FromException<TResult>(Exception) |
Cria um Task<TResult> que é concluído com uma exceção especificada. |
| FromResult<TResult>(TResult) |
Cria um Task<TResult> que é concluído com sucesso com o resultado especificado. |
| GetAwaiter() |
Acostuma um empregado para esperar por isto Task. |
| GetHashCode() |
Serve como função de hash predefinida. (Herdado de Object) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| Run(Action, CancellationToken) |
Coloca o trabalho especificado para executar no pool de threads e devolve um Task objeto que representa esse trabalho. Um token de cancelamento permite que a obra seja cancelada se ainda não tiver começado. |
| Run(Action) |
Coloca o trabalho especificado para executar no pool de threads e devolve um Task objeto que representa esse trabalho. |
| Run(Func<Task>, CancellationToken) |
Coloca o trabalho especificado na fila para executar no pool de threads e retorna um proxy para a tarefa devolvida por |
| Run(Func<Task>) |
Coloca o trabalho especificado na fila para executar no pool de threads e retorna um proxy para a tarefa devolvida por |
| Run<TResult>(Func<Task<TResult>>, CancellationToken) |
Coloca o trabalho especificado na fila para correr no pool de threads e retorna um proxy para o |
| Run<TResult>(Func<Task<TResult>>) |
Coloca o trabalho especificado na fila para correr no pool de threads e retorna um proxy para o |
| Run<TResult>(Func<TResult>, CancellationToken) |
Coloca o trabalho especificado para executar no pool de threads e devolve um |
| Run<TResult>(Func<TResult>) |
Coloca o trabalho especificado para executar no pool de threads e devolve um Task<TResult> objeto que representa esse trabalho. Um token de cancelamento permite que a obra seja cancelada se ainda não tiver começado. |
| RunSynchronously() |
Executa sincronizadamente Task com a corrente TaskScheduler. |
| RunSynchronously(TaskScheduler) |
Executa o Task sistema síncronicamente no TaskScheduler fornecido. |
| Start() |
Inicia o Task, agendando-o para execução para o atual TaskScheduler. |
| Start(TaskScheduler) |
Inicia o Task, agendando-o para execução ao especificado TaskScheduler. |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |
| Wait() |
Espera que a Task execução seja concluída. |
| Wait(CancellationToken) |
Espera que a Task execução seja concluída. A espera termina se um token de cancelamento for cancelado antes da tarefa concluir. |
| Wait(Int32, CancellationToken) |
Espera que a Task execução seja concluída. A espera termina se passar um intervalo de tempo ou se um token de cancelamento for cancelado antes da tarefa ser concluída. |
| Wait(Int32) |
Espera que a Task execução seja concluída dentro de um número especificado de milissegundos. |
| Wait(TimeSpan, CancellationToken) |
Espera que a Task execução seja concluída. |
| Wait(TimeSpan) |
Espera que a Task execução seja concluída dentro de um intervalo de tempo especificado. |
| WaitAll(IEnumerable<Task>, CancellationToken) |
Espera que todos os objetos fornecidos Task concluam a execução, a menos que a espera seja cancelada. |
| WaitAll(ReadOnlySpan<Task>) |
Espera que todos os objetos fornecidos Task sejam concluídos na execução. |
| WaitAll(Task[], CancellationToken) |
Espera que todos os objetos fornecidos Task concluam a execução, a menos que a espera seja cancelada. |
| WaitAll(Task[], Int32, CancellationToken) |
Espera que todos os objetos fornecidos Task completem a execução dentro de um número especificado de milissegundos ou até que a espera seja cancelada. |
| WaitAll(Task[], Int32) |
Espera que todos os objetos fornecidos Task concluam a execução dentro de um número especificado de milissegundos. |
| WaitAll(Task[], TimeSpan) |
Espera que todos os objetos canceláveis Task fornecidos concluam a execução dentro de um intervalo de tempo especificado. |
| WaitAll(Task[]) |
Espera que todos os objetos fornecidos Task sejam concluídos na execução. |
| WaitAny(Task[], CancellationToken) |
Espera que qualquer um dos objetos fornecidos Task conclua a execução, a menos que a espera seja cancelada. |
| WaitAny(Task[], Int32, CancellationToken) |
Aguarda que qualquer um dos objetos fornecidos Task complete a execução dentro de um número especificado de milissegundos ou até que um token de cancelamento seja cancelado. |
| WaitAny(Task[], Int32) |
Aguarda que qualquer um dos objetos fornecidos Task complete a execução dentro de um número especificado de milissegundos. |
| WaitAny(Task[], TimeSpan) |
Aguarda que qualquer um dos objetos fornecidos Task complete a execução dentro de um intervalo de tempo especificado. |
| WaitAny(Task[]) |
Espera que qualquer um dos objetos fornecidos Task complete a execução. |
| WaitAsync(CancellationToken) |
Recebe um Task que será concluído quando isto Task for concluído ou quando o especificado CancellationToken tiver pedido de cancelamento. |
| WaitAsync(TimeSpan, CancellationToken) |
Recebe um Task que será concluído quando isto Task terminar, quando o timeout especificado expirar, ou quando o especificado CancellationToken for solicitado o cancelamento. |
| WaitAsync(TimeSpan, TimeProvider, CancellationToken) |
Recebe um Task que será concluído quando isto Task terminar, quando o timeout especificado expirar, ou quando o especificado CancellationToken for solicitado o cancelamento. |
| WaitAsync(TimeSpan, TimeProvider) |
Recebe um Task que será concluído quando isto Task terminar ou quando o tempo de espera especificado expirar. |
| WaitAsync(TimeSpan) |
Recebe um Task que será concluído quando isto Task terminar ou quando o tempo de espera especificado expirar. |
| WhenAll(IEnumerable<Task>) |
Cria uma tarefa que será concluída quando todos os Task objetos de uma coleção enumerável estiverem concluídos. |
| WhenAll(ReadOnlySpan<Task>) |
Cria uma tarefa que será concluída quando todas as tarefas fornecidas estiverem concluídas. |
| WhenAll(Task[]) |
Cria uma tarefa que será concluída quando todos os Task objetos de um array estiverem concluídos. |
| WhenAll<TResult>(IEnumerable<Task<TResult>>) |
Cria uma tarefa que será concluída quando todos os Task<TResult> objetos de uma coleção enumerável estiverem concluídos. |
| WhenAll<TResult>(ReadOnlySpan<Task<TResult>>) |
Cria uma tarefa que será concluída quando todas as tarefas fornecidas estiverem concluídas. |
| WhenAll<TResult>(Task<TResult>[]) |
Cria uma tarefa que será concluída quando todos os Task<TResult> objetos de um array estiverem concluídos. |
| WhenAny(IEnumerable<Task>) |
Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída. |
| WhenAny(ReadOnlySpan<Task>) |
Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída. |
| WhenAny(Task, Task) |
Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída. |
| WhenAny(Task[]) |
Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída. |
| WhenAny<TResult>(IEnumerable<Task<TResult>>) |
Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída. |
| WhenAny<TResult>(ReadOnlySpan<Task<TResult>>) |
Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída. |
| WhenAny<TResult>(Task<TResult>, Task<TResult>) |
Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída. |
| WhenAny<TResult>(Task<TResult>[]) |
Cria uma tarefa que será concluída quando qualquer uma das tarefas fornecidas estiver concluída. |
| WhenEach(IEnumerable<Task>) |
Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas. |
| WhenEach(ReadOnlySpan<Task>) |
Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas. |
| WhenEach(Task[]) |
Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas. |
| WhenEach<TResult>(IEnumerable<Task<TResult>>) |
Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas. |
| WhenEach<TResult>(ReadOnlySpan<Task<TResult>>) |
Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas. |
| WhenEach<TResult>(Task<TResult>[]) |
Cria um IAsyncEnumerable<T> que irá gerar as tarefas fornecidas à medida que essas tarefas são concluídas. |
| Yield() |
Cria uma tarefa aguardável que retorna assíncronamente ao contexto atual quando aguardada. |
Implementações de Interface Explícita
| Name | Descrição |
|---|---|
| IAsyncResult.AsyncWaitHandle |
Obtém um WaitHandle que pode ser usado para esperar que a tarefa seja concluída. |
| IAsyncResult.CompletedSynchronously |
Obtém uma indicação de se a operação foi concluída de forma síncrona. |
Métodos da Extensão
| Name | Descrição |
|---|---|
| AsAsyncAction(Task) |
Retorna uma ação assíncrona do Windows Runtime que representa uma tarefa iniciada. |
| DispatcherOperationWait(Task, TimeSpan) |
Espera o tempo especificado para que o subjacente DispatcherOperation seja concluído. |
| DispatcherOperationWait(Task) |
Espera indefinidamente que o subjacente DispatcherOperation seja concluído. |
| IsDispatcherOperationTask(Task) |
Devolve um valor que indica se isto Task está associado a um DispatcherOperation. |
Aplica-se a
Segurança de Thread
Todos os membros de Task, exceto Dispose(), são seguros para threads e podem ser usados a partir de múltiplas threads em simultâneo.