Udostępnij za pośrednictwem


TaskCompletionSource<TResult> Klasa

Definicja

Reprezentuje stronę producenta Task<TResult> niepowiązanego z pełnomocnikiem, zapewniając dostęp do strony konsumenta przez właściwość Task.

generic <typename TResult>
public ref class TaskCompletionSource
public class TaskCompletionSource<TResult>
type TaskCompletionSource<'Result> = class
Public Class TaskCompletionSource(Of TResult)

Parametry typu

TResult

Typ wartości wyniku skojarzonej z tą TaskCompletionSource<TResult>.

Dziedziczenie
TaskCompletionSource<TResult>

Przykłady

W poniższym przykładzie pokazano, jak używać 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

Uwagi

W wielu scenariuszach warto umożliwić Task<TResult> reprezentowanie zewnętrznej operacji asynchronicznej. w tym celu TaskCompletionSource<TResult>. Umożliwia tworzenie zadania, które można przekazać konsumentom. Użytkownicy mogą używać elementów członkowskich zadania w taki sam sposób, jak w każdym innym scenariuszu obsługującym zmienne składowe zadania. Jednak w przeciwieństwie do większości zadań stan zadania utworzonego przez zadanieCompletionSource jest kontrolowany jawnie przez metody w taskCompletionSource. Umożliwia to propagowanie zewnętrznej operacji asynchronicznej do bazowego zadania. Separacja gwarantuje również, że konsumenci nie będą mogli przenieść stanu bez dostępu do odpowiedniego elementu TaskCompletionSource. Aby uzyskać więcej informacji, zobacz wpis Nature of TaskCompletionSource<TResult> w blogu Programowanie równoległe za pomocą platformy .NET.

Przykłady Parallel Extensions również zawierają przykłady używania TaskCompletionSource<TResult>.

Konstruktory

TaskCompletionSource<TResult>()

Tworzy TaskCompletionSource<TResult>.

TaskCompletionSource<TResult>(Object)

Tworzy TaskCompletionSource<TResult> o określonym stanie.

TaskCompletionSource<TResult>(Object, TaskCreationOptions)

Tworzy TaskCompletionSource<TResult> z określonym stanem i opcjami.

TaskCompletionSource<TResult>(TaskCreationOptions)

Tworzy TaskCompletionSource<TResult> z określonymi opcjami.

Właściwości

Task

Pobiera Task<TResult> utworzone przez ten TaskCompletionSource<TResult>.

Metody

Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetType()

Pobiera Type bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Object.

(Odziedziczone po Object)
SetCanceled()

Przenosi Task<TResult> bazowe do stanu Canceled.

SetCanceled(CancellationToken)

Przenosi Task<TResult> bazową do stanu Canceled przy użyciu określonego tokenu.

SetException(Exception)

Przenosi bazowe Task<TResult> do stanu Faulted i wiąże je z określonym wyjątkiem.

SetException(IEnumerable<Exception>)

Przenosi bazowe Task<TResult> do stanu Faulted i wiąże z nim kolekcję obiektów wyjątków.

SetFromTask(Task<TResult>)

Przenosi Task<TResult> bazową do tego samego stanu ukończenia co określony completedTask.

SetResult(TResult)

Przenosi Task<TResult> bazowe do stanu RanToCompletion.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)
TrySetCanceled()

Próbuje przenieść Task<TResult> bazową do stanu Canceled.

TrySetCanceled(CancellationToken)

Próbuje przenieść podstawowy Task<TResult> do stanu Canceled i umożliwia przechowywanie tokenu anulowania w anulowanym zadaniu.

TrySetException(Exception)

Próbuje przenieść Task<TResult> bazową do stanu Faulted i powiązać go z określonym wyjątkiem.

TrySetException(IEnumerable<Exception>)

Próbuje przenieść Task<TResult> bazową do stanu Faulted i powiązać z nim kolekcję obiektów wyjątków.

TrySetFromTask(Task<TResult>)

Próbuje przenieść Task<TResult> bazową do tego samego stanu ukończenia co określony completedTask.

TrySetResult(TResult)

Próbuje przenieść Task<TResult> bazową do stanu RanToCompletion.

Dotyczy

Bezpieczeństwo wątkowe

Wszystkie elementy członkowskie TaskCompletionSource<TResult> są bezpieczne wątkowo i mogą być używane z wielu wątków jednocześnie.

Zobacz też