TaskCompletionSource<TResult> Sınıf

Tanım

Temsilciye bağlı olmayan bir Task<TResult> üretici tarafını temsil eder ve özellik aracılığıyla Task tüketici tarafına erişim sağlar.

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

Tür Parametreleri

TResult

Bu TaskCompletionSource<TResult>ile ilişkili sonuç değerinin türü.

Devralma
TaskCompletionSource<TResult>

Örnekler

Aşağıdaki örnekte, nasıl kullanılacağı gösterilmektedir 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

Açıklamalar

Birçok senaryoda, bir dış zaman uyumsuz işlemi temsil etmek için etkinleştirmek Task<TResult> yararlıdır. TaskCompletionSource<TResult> bu amaçla sağlanır. Tüketicilere dağıtılabilir bir görev oluşturulmasını sağlar. Tüketiciler, görev üyelerini diğer senaryo işleme görev üyesi değişkenlerinde olduğu gibi kullanabilir. Ancak, görevlerin çoğundan farklı olarak, TaskCompletionSource tarafından oluşturulan bir görevin durumu, TaskCompletionSource'ta yöntemler tarafından açıkça denetlenmektedir. Bu, dış zaman uyumsuz işlemin tamamlanmasının temel alınan Göreve yayılmasını sağlar. Ayrım, tüketicilerin ilgili TaskCompletionSource'a erişim olmadan durumu geçirememesini de sağlar. Daha fazla bilgi için .NET ile Paralel Programlama blogundaki TaskCompletionSource'un<TResult> Yapısı girdisine bakın.

Paralel Uzantılar örnekleri, 'nin nasıl kullanılacağına TaskCompletionSource<TResult>ilişkin örnekler de içerir.

Oluşturucular

TaskCompletionSource<TResult>()

bir TaskCompletionSource<TResult>oluşturur.

TaskCompletionSource<TResult>(Object)

Belirtilen durumla bir TaskCompletionSource<TResult> oluşturur.

TaskCompletionSource<TResult>(Object, TaskCreationOptions)

Belirtilen durum ve seçeneklerle bir TaskCompletionSource<TResult> oluşturur.

TaskCompletionSource<TResult>(TaskCreationOptions)

Belirtilen seçeneklerle bir TaskCompletionSource<TResult> oluşturur.

Özellikler

Task

Tarafından TaskCompletionSource<TResult>oluşturulan öğesini Task<TResult> alır.

Yöntemler

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetType()

Type Geçerli örneğini alır.

(Devralındığı yer: Object)
MemberwiseClone()

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

(Devralındığı yer: Object)
SetCanceled()

Temel alınan Task<TResult> öğesini duruma geçirmektedir Canceled .

SetCanceled(CancellationToken)

Belirtilen belirteci kullanarak temel alınan Task<TResult> Canceled öğesini duruma geçirmektedir.

SetException(Exception)

Temel alınan Task<TResult> öğesini duruma geçirip Faulted belirtilen özel duruma bağlar.

SetException(IEnumerable<Exception>)

Temel alınan Task<TResult> öğesini duruma geçirerek Faulted özel durum nesnelerinin bir koleksiyonunu buna bağlar.

SetResult(TResult)

Temel alınan Task<TResult> öğesini duruma geçirmektedir RanToCompletion .

ToString()

Geçerli nesneyi temsil eden dizeyi döndürür.

(Devralındığı yer: Object)
TrySetCanceled()

Temel alınan Task<TResult> öğesini duruma geçiş yapmaya Canceled çalışır.

TrySetCanceled(CancellationToken)

Temel alınan Task<TResult> öğesini duruma geçirmeyi Canceled dener ve iptal edilen görevde bir iptal belirtecinin depolanmasını sağlar.

TrySetException(Exception)

Temel alınan Task<TResult> öğesini duruma dönüştürmeye Faulted çalışır ve bunu belirtilen özel duruma bağlar.

TrySetException(IEnumerable<Exception>)

Temel alınan Task<TResult> öğesini duruma dönüştürmeyi Faulted dener ve özel durum nesnelerinin bir koleksiyonunu buna bağlar.

TrySetResult(TResult)

Temel alınan Task<TResult> öğesini duruma geçiş yapmaya RanToCompletion çalışır.

Şunlara uygulanır

İş Parçacığı Güvenliği

tüm üyeleri TaskCompletionSource<TResult> iş parçacığı açısından güvenlidir ve aynı anda birden çok iş parçacığından kullanılabilir.

Ayrıca bkz.