TaskCompletionSource<TResult> Třída

Definice

Představuje stranu Task<TResult> producenta nevázaného delegáta a poskytuje přístup k 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é umožnit Task<TResult> reprezentaci externí asynchronní operace. TaskCompletionSource<TResult> je k tomuto účelu poskytován. Umožňuje vytvoření úkolu, který je možné předat spotřebitelů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á proměnné členů úkolu. Na rozdíl od většiny úkolů je ale stav úkolu vytvořeného taskCompletionSource explicitně řízen 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 Zdroji úkolů. Další informace najdete v příspěvku Nature of TaskCompletionSource<TResult> v paralelním programování pomocí blogu .NET.

Ukázky paralelních rozšíření obsahují také příklady použití TaskCompletionSource<TResult>.

Konstruktory

TaskCompletionSource<TResult>()

TaskCompletionSource<TResult>Vytvoří .

TaskCompletionSource<TResult>(Object)

Vytvoří se TaskCompletionSource<TResult> zadaným stavem.

TaskCompletionSource<TResult>(Object, TaskCreationOptions)

Vytvoří se TaskCompletionSource<TResult> zadaným stavem a možnostmi.

TaskCompletionSource<TResult>(TaskCreationOptions)

Vytvoří s TaskCompletionSource<TResult> zadanými možnostmi.

Vlastnosti

Task

Získá vytvořené Task<TResult> tímto TaskCompletionSource<TResult>.

Metody

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetHashCode()

Slouží jako výchozí funkce hash.

(Zděděno od Object)
GetType()

Type Získá aktuální instanci.

(Zděděno od Object)
MemberwiseClone()

Vytvoří použádnou kopii aktuálního souboru Object.

(Zděděno od Object)
SetCanceled()

Převede podkladový objekt Task<TResult> do Canceled stavu.

SetCanceled(CancellationToken)

Převede podkladový objekt Task<TResult> 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ý objekt Task<TResult> do Faulted stavu a vytvoří vazbu kolekce objektů výjimek.

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ý Canceled objekt Task<TResult> do stavu.

TrySetCanceled(CancellationToken)

Pokusí se převést podkladový kód Task<TResult> do Canceled stavu a umožní, aby se token zrušení uložil 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ý objekt Task<TResult> do Faulted stavu a vytvoří vazbu kolekce objektů výjimek.

TrySetResult(TResult)

Pokusí se převést podkladový objekt Task<TResult> do RanToCompletion stavu.

Platí pro

Bezpečný přístup z více vláken

Všichni členové TaskCompletionSource<TResult> jsou bezpečné pro vlákno a mohou být použity z více vláken současně.

Viz také