TaskCompletionSource<TResult> Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Representerar producentsidan för ett Task<TResult> obundet till ett ombud, vilket ger åtkomst till konsumentsidan via Task egenskapen.
generic <typename TResult>
public ref class TaskCompletionSource
public class TaskCompletionSource<TResult>
type TaskCompletionSource<'Result> = class
Public Class TaskCompletionSource(Of TResult)
Typparametrar
- TResult
Typen av resultatvärde som är associerat med den här TaskCompletionSource<TResult>.
- Arv
-
TaskCompletionSource<TResult>
Exempel
I följande exempel visas hur du använder en 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
Kommentarer
I många scenarier är det användbart att aktivera en Task<TResult> för att representera en extern asynkron åtgärd. TaskCompletionSource<TResult> tillhandahålls för detta ändamål. Det gör det möjligt att skapa en uppgift som kan delas ut till konsumenterna. Konsumenterna kan använda medlemmarna i uppgiften på samma sätt som i andra scenarier som hanterar aktivitetsmedlemsvariabler. Men till skillnad från de flesta aktiviteter styrs tillståndet för en uppgift som skapats av en TaskCompletionSource explicit av metoderna på TaskCompletionSource. På så sätt kan slutförandet av den externa asynkrona åtgärden spridas till den underliggande aktiviteten. Separationen säkerställer också att konsumenterna inte kan överföra tillståndet utan åtkomst till motsvarande TaskCompletionSource. Mer information finns i posten The Nature of TaskCompletionSource<TResult> i bloggen Parallell programmering med .NET.
Konstruktorer
| Name | Description |
|---|---|
| TaskCompletionSource<TResult>() |
Skapar en TaskCompletionSource<TResult>. |
| TaskCompletionSource<TResult>(Object, TaskCreationOptions) |
Skapar en TaskCompletionSource<TResult> med angivet tillstånd och alternativ. |
| TaskCompletionSource<TResult>(Object) |
Skapar en TaskCompletionSource<TResult> med det angivna tillståndet. |
| TaskCompletionSource<TResult>(TaskCreationOptions) |
Skapar en TaskCompletionSource<TResult> med de angivna alternativen. |
Egenskaper
| Name | Description |
|---|---|
| Task |
Hämtar den Task<TResult> skapade av den här TaskCompletionSource<TResult>. |
Metoder
| Name | Description |
|---|---|
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| SetCanceled() |
Överför den underliggande till Task<TResult> tillståndet Canceled . |
| SetCanceled(CancellationToken) |
Överför den underliggande till Task<TResult> tillståndet Canceled med den angivna token. |
| SetException(Exception) |
Övergår den underliggande till Task<TResult> tillståndet Faulted och binder den till ett angivet undantag. |
| SetException(IEnumerable<Exception>) |
Överför underliggande Task<TResult> objekt till Faulted tillståndet och binder en samling undantagsobjekt till det. |
| SetFromTask(Task<TResult>) |
Övergår den underliggande till Task<TResult> samma slutförandetillstånd som den angivna |
| SetResult(TResult) |
Överför den underliggande till Task<TResult> tillståndet RanToCompletion . |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
| TrySetCanceled() |
Försöker överföra den underliggande till Task<TResult> tillståndet Canceled . |
| TrySetCanceled(CancellationToken) |
Försöker överföra den underliggande Task<TResult> till tillståndet Canceled och gör att en annulleringstoken kan lagras i den avbrutna aktiviteten. |
| TrySetException(Exception) |
Försöker överföra den underliggande filen Task<TResult> till tillståndet Faulted och binder den till ett angivet undantag. |
| TrySetException(IEnumerable<Exception>) |
Försöker överföra underliggande Task<TResult> objekt till Faulted tillståndet och binder en samling undantagsobjekt till den. |
| TrySetFromTask(Task<TResult>) |
Försöker överföra den underliggande till Task<TResult> samma slutförandetillstånd som den angivna |
| TrySetResult(TResult) |
Försöker överföra den underliggande till Task<TResult> tillståndet RanToCompletion . |
Gäller för
Trådsäkerhet
Alla medlemmar TaskCompletionSource<TResult> i är trådsäkra och kan användas från flera trådar samtidigt.