TaskCompletionSource<TResult> 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 o lado produtor de um Task<TResult> representante não vinculado a um delegado, proporcionando acesso ao lado do consumidor através da Task propriedade.
generic <typename TResult>
public ref class TaskCompletionSource
public class TaskCompletionSource<TResult>
type TaskCompletionSource<'Result> = class
Public Class TaskCompletionSource(Of TResult)
Parâmetros de Tipo Genérico
- TResult
O tipo do valor do resultado associado a este TaskCompletionSource<TResult>.
- Herança
-
TaskCompletionSource<TResult>
Exemplos
O exemplo seguinte mostra como usar um TaskCompletionSource<TResult>:
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
class TCSDemo
{
// Demonstrated features:
// TaskCompletionSource ctor()
// TaskCompletionSource.SetResult()
// TaskCompletionSource.SetException()
// Task.Result
// Expected results:
// The attempt to get t1.Result blocks for ~1000ms until tcs1 gets signaled. 15 is printed out.
// The attempt to get t2.Result blocks for ~1000ms until tcs2 gets signaled. An exception is printed out.
static void Main()
{
TaskCompletionSource<int> tcs1 = new TaskCompletionSource<int>();
Task<int> t1 = tcs1.Task;
// Start a background task that will complete tcs1.Task
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
tcs1.SetResult(15);
});
// The attempt to get the result of t1 blocks the current thread until the completion source gets signaled.
// It should be a wait of ~1000 ms.
Stopwatch sw = Stopwatch.StartNew();
int result = t1.Result;
sw.Stop();
Console.WriteLine("(ElapsedTime={0}): t1.Result={1} (expected 15) ", sw.ElapsedMilliseconds, result);
// ------------------------------------------------------------------
// Alternatively, an exception can be manually set on a TaskCompletionSource.Task
TaskCompletionSource<int> tcs2 = new TaskCompletionSource<int>();
Task<int> t2 = tcs2.Task;
// Start a background Task that will complete tcs2.Task with an exception
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
tcs2.SetException(new InvalidOperationException("SIMULATED EXCEPTION"));
});
// The attempt to get the result of t2 blocks the current thread until the completion source gets signaled with either a result or an exception.
// In either case it should be a wait of ~1000 ms.
sw = Stopwatch.StartNew();
try
{
result = t2.Result;
Console.WriteLine("t2.Result succeeded. THIS WAS NOT EXPECTED.");
}
catch (AggregateException e)
{
Console.Write("(ElapsedTime={0}): ", sw.ElapsedMilliseconds);
Console.WriteLine("The following exceptions have been thrown by t2.Result: (THIS WAS EXPECTED)");
for (int j = 0; j < e.InnerExceptions.Count; j++)
{
Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString());
}
}
}
}
Imports System.Diagnostics
Imports System.Threading
Imports System.Threading.Tasks
Module TCSDemo
' Demonstrated features:
' TaskCompletionSource ctor()
' TaskCompletionSource.SetResult()
' TaskCompletionSource.SetException()
' Task.Result
' Expected results:
' The attempt to get t1.Result blocks for ~1000ms until tcs1 gets signaled. 15 is printed out.
' The attempt to get t2.Result blocks for ~1000ms until tcs2 gets signaled. An exception is printed out.
Private Sub Main()
Dim tcs1 As New TaskCompletionSource(Of Integer)()
Dim t1 As Task(Of Integer) = tcs1.Task
' Start a background task that will complete tcs1.Task
Task.Factory.StartNew(Sub()
Thread.Sleep(1000)
tcs1.SetResult(15)
End Sub)
' The attempt to get the result of t1 blocks the current thread until the completion source gets signaled.
' It should be a wait of ~1000 ms.
Dim sw As Stopwatch = Stopwatch.StartNew()
Dim result As Integer = t1.Result
sw.Stop()
Console.WriteLine("(ElapsedTime={0}): t1.Result={1} (expected 15) ", sw.ElapsedMilliseconds, result)
' ------------------------------------------------------------------
' Alternatively, an exception can be manually set on a TaskCompletionSource.Task
Dim tcs2 As New TaskCompletionSource(Of Integer)()
Dim t2 As Task(Of Integer) = tcs2.Task
' Start a background Task that will complete tcs2.Task with an exception
Task.Factory.StartNew(Sub()
Thread.Sleep(1000)
tcs2.SetException(New InvalidOperationException("SIMULATED EXCEPTION"))
End Sub)
' The attempt to get the result of t2 blocks the current thread until the completion source gets signaled with either a result or an exception.
' In either case it should be a wait of ~1000 ms.
sw = Stopwatch.StartNew()
Try
result = t2.Result
Console.WriteLine("t2.Result succeeded. THIS WAS NOT EXPECTED.")
Catch e As AggregateException
Console.Write("(ElapsedTime={0}): ", sw.ElapsedMilliseconds)
Console.WriteLine("The following exceptions have been thrown by t2.Result: (THIS WAS EXPECTED)")
For j As Integer = 0 To e.InnerExceptions.Count - 1
Console.WriteLine(vbLf & "-------------------------------------------------" & vbLf & "{0}", e.InnerExceptions(j).ToString())
Next
End Try
End Sub
End Module
Observações
Em muitos cenários, é útil permitir que a Task<TResult> represente uma operação assíncrona externa. TaskCompletionSource<TResult> é disponibilizado para esse fim. Permite a criação de uma tarefa que pode ser atribuída aos consumidores. Os consumidores podem usar os membros da tarefa da mesma forma que fariam em qualquer outro cenário, lidando com variáveis dos membros da tarefa. No entanto, ao contrário da maioria das tarefas, o estado de uma tarefa criada por um TaskCompletionSource é controlado explicitamente pelos métodos no TaskCompletionSource. Isto permite que a conclusão da operação assíncrona externa seja propagada para a Tarefa subjacente. A separação também garante que os consumidores não conseguem fazer a transição do estado sem acesso ao correspondente TaskCompletionSource. Para mais informações, consulte a entrada The Nature of TaskCompletionSource<TResult> no blogue Parallel Programming with .NET.
Construtores
| Name | Description |
|---|---|
| TaskCompletionSource<TResult>() |
Cria um TaskCompletionSource<TResult>. |
| TaskCompletionSource<TResult>(Object, TaskCreationOptions) |
Cria um TaskCompletionSource<TResult> com o estado e as opções especificados. |
| TaskCompletionSource<TResult>(Object) |
Cria um TaskCompletionSource<TResult> com o estado especificado. |
| TaskCompletionSource<TResult>(TaskCreationOptions) |
Cria um TaskCompletionSource<TResult> com as opções especificadas. |
Propriedades
| Name | Description |
|---|---|
| Task |
Obtém-se Task<TResult> criado por isto TaskCompletionSource<TResult>. |
Métodos
| Name | Description |
|---|---|
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| 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) |
| SetCanceled() |
Faz a transição do subjacente Task<TResult> para o Canceled estado. |
| SetCanceled(CancellationToken) |
Faz a transição do subjacente Task<TResult> para o Canceled estado usando o token especificado. |
| SetException(Exception) |
Faz a transição do subjacente Task<TResult> para o Faulted estado e liga-o a uma exceção especificada. |
| SetException(IEnumerable<Exception>) |
Faz a transição do subjacente Task<TResult> para o Faulted estado e liga uma coleção de objetos de exceção a ele. |
| SetFromTask(Task<TResult>) |
Faz a transição do subjacente Task<TResult> para o mesmo estado de completude do especificado |
| SetResult(TResult) |
Faz a transição do subjacente Task<TResult> para o RanToCompletion estado. |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |
| TrySetCanceled() |
Tenta fazer a transição do subjacente Task<TResult> para o Canceled estado. |
| TrySetCanceled(CancellationToken) |
Tenta fazer a transição do subjacente Task<TResult> para o Canceled estado e permite que um token de cancelamento seja armazenado na tarefa cancelada. |
| TrySetException(Exception) |
Tenta fazer a transição do subjacente Task<TResult> para o Faulted estado e liga-o a uma exceção especificada. |
| TrySetException(IEnumerable<Exception>) |
Tenta fazer a transição do subjacente Task<TResult> para o Faulted estado e liga uma coleção de objetos de exceção a ele. |
| TrySetFromTask(Task<TResult>) |
Tenta fazer a transição do subjacente Task<TResult> para o mesmo estado de conclusão do especificado |
| TrySetResult(TResult) |
Tenta fazer a transição do subjacente Task<TResult> para o RanToCompletion estado. |
Aplica-se a
Segurança de Thread
Todos os membros de TaskCompletionSource<TResult> são seguros para threads e podem ser usados a partir de múltiplos threads em simultâneo.