TaskCompletionSource<TResult> Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Představuje stranu producenta nevázaného Task<TResult> delegáta a poskytuje přístup ke straně příjemce prostřednictvím Task vlastnosti.
generic <typename TResult>
public ref class TaskCompletionSource
public class TaskCompletionSource<TResult>
type TaskCompletionSource<'Result> = class
Public Class TaskCompletionSource(Of TResult)
Parametry typu
- TResult
Typ výsledné hodnoty přidružené k tomuto TaskCompletionSource<TResult>.
- Dědičnost
-
TaskCompletionSource<TResult>
Příklady
Následující příklad ukazuje, jak použít 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
Poznámky
V mnoha scénářích je užitečné povolit Task<TResult> reprezentaci externí asynchronní operace. TaskCompletionSource<TResult> je k tomuto účelu poskytován. Umožňuje vytvořit úlohu, která se dá předat příjemcům. Příjemci můžou členy úkolu používat stejným způsobem jako v jakémkoli jiném scénáři, který zpracovává členské proměnné úkolu. Na rozdíl od většiny úkolů je však stav úlohy vytvořené TaskCompletionSource řízen explicitně metodami na TaskCompletionSource. To umožňuje rozšíření externí asynchronní operace do podkladové úlohy. Oddělení také zajišťuje, aby příjemci nemohli převést stav bez přístupu k odpovídajícímu taskCompletionSource. Další informace najdete v položce Národnost úkoluCompletionSource<TResult> v blogu Paralelní programování s .NET.
Konstruktory
| Name | Description |
|---|---|
| TaskCompletionSource<TResult>() |
Vytvoří TaskCompletionSource<TResult>. |
| TaskCompletionSource<TResult>(Object, TaskCreationOptions) |
Vytvoří se zadaným stavem TaskCompletionSource<TResult> a možnostmi. |
| TaskCompletionSource<TResult>(Object) |
Vytvoří se zadaným stavem TaskCompletionSource<TResult> . |
| TaskCompletionSource<TResult>(TaskCreationOptions) |
Vytvoří se TaskCompletionSource<TResult> zadanými možnostmi. |
Vlastnosti
| Name | Description |
|---|---|
| Task |
Získá vytvořený Task<TResult> tímto TaskCompletionSource<TResult>. |
Metody
| Name | Description |
|---|---|
| Equals(Object) |
Určuje, zda je zadaný objekt roven aktuálnímu objektu. (Zděděno od Object) |
| GetHashCode() |
Slouží jako výchozí funkce hash. (Zděděno od Object) |
| GetType() |
Získá Type aktuální instance. (Zděděno od Object) |
| MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Object. (Zděděno od Object) |
| SetCanceled() |
Převede podkladový objekt Task<TResult> do Canceled stavu. |
| SetCanceled(CancellationToken) |
Převede podkladový Task<TResult> objekt do Canceled stavu pomocí zadaného tokenu. |
| SetException(Exception) |
Převede podkladový objekt Task<TResult> do Faulted stavu a vytvoří vazbu na zadanou výjimku. |
| SetException(IEnumerable<Exception>) |
Převede podkladový Task<TResult> objekt do Faulted stavu a vytvoří vazbu na kolekci objektů výjimek. |
| SetFromTask(Task<TResult>) |
Převede podkladový objekt Task<TResult> do stejného stavu dokončení jako zadaný |
| SetResult(TResult) |
Převede podkladový objekt Task<TResult> do RanToCompletion stavu. |
| ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |
| TrySetCanceled() |
Pokusí se převést podkladový Task<TResult> objekt do Canceled stavu. |
| TrySetCanceled(CancellationToken) |
Pokusí se převést podkladový Task<TResult> objekt do Canceled stavu a umožní uložení tokenu zrušení do zrušené úlohy. |
| TrySetException(Exception) |
Pokusí se převést podkladový objekt Task<TResult> do Faulted stavu a vytvoří vazbu na zadanou výjimku. |
| TrySetException(IEnumerable<Exception>) |
Pokusí se převést podkladový Task<TResult> objekt do Faulted stavu a vytvoří vazbu kolekce objektů výjimky. |
| TrySetFromTask(Task<TResult>) |
Pokusí se převést podkladový soubor Task<TResult> do stejného stavu dokončení jako zadaný |
| TrySetResult(TResult) |
Pokusí se převést podkladový Task<TResult> objekt do RanToCompletion stavu. |
Platí pro
Bezpečný přístup z více vláken
Všichni členové TaskCompletionSource<TResult> jsou bezpečné pro přístup z více vláken a můžou být současně použity z více vláken.