TaskCompletionSource<TResult> Класс

Определение

Представляет сторону производителя задач Task<TResult>, не привязанных к делегату и предоставляющих доступ к потребительской стороне через свойство Task.

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

Параметры типа

TResult

Тип результирующих значений, связанных с этим TaskCompletionSource<TResult>.

Наследование
TaskCompletionSource<TResult>

Примеры

В следующем примере показано, как использовать: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

Комментарии

Во многих сценариях полезно включить Task<TResult> представление внешней асинхронной операции. TaskCompletionSource<TResult> предоставляется для этой цели. Это позволяет создавать задачу, которая может быть передана потребителям. Потребители могут использовать члены задачи так же, как и в любом другом сценарии, обрабатывающего переменные-члены задачи. Однако, в отличие от большинства задач, состояние задачи, созданной TaskCompletionSource, контролируется явным образом методами в TaskCompletionSource. Это позволяет распространить внешнюю асинхронную операцию в базовую задачу. Разделение также гарантирует, что потребители не смогут переходить состояние без доступа к соответствующему TaskCompletionSource. Дополнительные сведения см. в записи "Природа taskCompletionSource<TResult> " в блоге по параллельному программированию с помощью .NET.

Примеры параллельных расширений также содержат примеры использованияTaskCompletionSource<TResult>.

Конструкторы

TaskCompletionSource<TResult>()

Создает объект TaskCompletionSource<TResult>.

TaskCompletionSource<TResult>(Object)

Создает объект TaskCompletionSource<TResult> с указанным состоянием.

TaskCompletionSource<TResult>(Object, TaskCreationOptions)

Создает объект TaskCompletionSource<TResult> с заданным состоянием и параметрами.

TaskCompletionSource<TResult>(TaskCreationOptions)

Создает объект TaskCompletionSource<TResult> с заданными параметрами.

Свойства

Task

Получает объект Task<TResult>, созданный данным объектом TaskCompletionSource<TResult>.

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
SetCanceled()

Переводит базовый объект Task<TResult> в состояние Canceled.

SetCanceled(CancellationToken)

Переводит базовый объект Task<TResult> в состояние Canceled с использованием указанного токена.

SetException(Exception)

Переводит базовый объект Task<TResult> в состояние Faulted и привязывает его к определенному исключению.

SetException(IEnumerable<Exception>)

Переводит базовый объект Task<TResult> в состояние Faulted и привязывает к нему коллекцию объектов исключений.

SetResult(TResult)

Переводит базовый объект Task<TResult> в состояние RanToCompletion.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
TrySetCanceled()

Пытается перевести базовый объект Task<TResult> в состояние Canceled.

TrySetCanceled(CancellationToken)

Пытается перевести базовый объект Task<TResult> в состояние Canceled и позволяет хранить токен отмены в задаче отмены.

TrySetException(Exception)

Пытается перевести базовый элемент Task<TResult> в состояние Faulted и привязывает его к определенному исключению.

TrySetException(IEnumerable<Exception>)

Пытается перевести базовый Task<TResult> в состояние Faulted и привязывает к нему коллекцию объектов исключений.

TrySetResult(TResult)

Пытается перевести базовый объект Task<TResult> в состояние RanToCompletion.

Применяется к

Потокобезопасность

Все члены TaskCompletionSource<TResult> являются потокобезопасными и могут использоваться из нескольких потоков одновременно.

См. также раздел