Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Clase TaskCompletionSource<TResult>

 

Publicado: noviembre de 2016

Representa el lado del productor de una Task<TResult> sin enlazar a un delegado, proporcionando acceso al lado del consumidor mediante la propiedad Task.

Espacio de nombres:   System.Threading.Tasks
Ensamblado:  mscorlib (en mscorlib.dll)

System.Object
  System.Threading.Tasks.TaskCompletionSource<TResult>

[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public class TaskCompletionSource<TResult>

Parámetros de tipo

TResult

Tipo del valor de resultado asociado a este objeto TaskCompletionSource<TResult>.

NombreDescripción
System_CAPS_pubmethodTaskCompletionSource<TResult>()

Crea un objeto TaskCompletionSource<TResult>.

System_CAPS_pubmethodTaskCompletionSource<TResult>(Object)

Crea un objeto TaskCompletionSource<TResult> con el estado especificado.

System_CAPS_pubmethodTaskCompletionSource<TResult>(Object, TaskCreationOptions)

Crea un objeto TaskCompletionSource<TResult> con el estado y las opciones especificados.

System_CAPS_pubmethodTaskCompletionSource<TResult>(TaskCreationOptions)

Crea un objeto TaskCompletionSource<TResult> con las opciones especificadas.

NombreDescripción
System_CAPS_pubpropertyTask

Obtiene la Task<TResult> creada por este objeto TaskCompletionSource<TResult>.

NombreDescripción
System_CAPS_pubmethodEquals(Object)

Determina si el objeto especificado es igual al objeto actual.(Heredado de Object).

System_CAPS_protmethodFinalize()

Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por el recolector de basura. (Heredado de Object).

System_CAPS_pubmethodGetHashCode()

Sirve como la función hash predeterminada.(Heredado de Object).

System_CAPS_pubmethodGetType()

Obtiene el Type de la instancia actual.(Heredado de Object).

System_CAPS_protmethodMemberwiseClone()

Crea una copia superficial del Object actual.(Heredado de Object).

System_CAPS_pubmethodSetCanceled()

Transiciona la Task<TResult> subyacente al estado Canceled.

System_CAPS_pubmethodSetException(Exception)

Realiza transiciones del Task<TResult> subyacente en el estado Faulted y lo enlaza a una excepción especificada.

System_CAPS_pubmethodSetException(IEnumerable<Exception>)

Realiza transiciones del Task<TResult> subyacente al estado TaskStatus.Faulted y enlaza en él una colección de objetos de excepción.

System_CAPS_pubmethodSetResult(TResult)

Transiciona la Task<TResult> subyacente al estado RanToCompletion.

System_CAPS_pubmethodToString()

Devuelve una cadena que representa al objeto actual. (Heredado de Object).

System_CAPS_pubmethodTrySetCanceled()

Intenta transicionar la Task<TResult> subyacente al estado Canceled.

System_CAPS_pubmethodTrySetCanceled(CancellationToken)

Intenta transicionar la Task<TResult> subyacente al estado TaskStatus.Canceled y permite que se almacene un token de cancelación en la tarea cancelada.

System_CAPS_pubmethodTrySetException(Exception)

Intenta realizar transiciones del Task<TResult> subyacente al estado Faulted y lo enlaza a una excepción especificada.

System_CAPS_pubmethodTrySetException(IEnumerable<Exception>)

Intenta realizar transiciones del Task<TResult> subyacente al estado Faulted y enlaza en él una colección de objetos de excepción.

System_CAPS_pubmethodTrySetResult(TResult)

Intenta transicionar la Task<TResult> subyacente al estado RanToCompletion.

En muchos escenarios, resulta útil habilitar una Task<TResult> para representar una operación asincrónica externa. TaskCompletionSource<TResult> se proporciona para este propósito. Permite la creación de una tarea que se pueda pasar a los consumidores y los consumidores pueden utilizar a los miembros de la tarea como lo harían con cualquier otro. Sin embargo, a diferencia de la mayoría de las tareas, el estado de una tarea creada por TaskCompletionSource controlan explícitamente los métodos en TaskCompletionSource. Esto permite la realización de la operación asincrónica externa se propagará a la tarea subyacente. La separación también asegura que los consumidores no pueden cambiar el estado sin acceso al TaskCompletionSource correspondiente. Para obtener más información, vea la entrada The Nature of TaskCompletionSource<TResult> en el blog Parallel Programming with .NET.

El Parallel Extensions samples también contienen ejemplos de cómo usar TaskCompletionSource<TResult>.

En el ejemplo siguiente se muestra cómo utilizar un 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());
            }
        }
    }

}

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 4.0
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 5.0
Windows Phone Silverlight
Disponible desde 8.0
Windows Phone
Disponible desde 8.1

Todos los miembros de TaskCompletionSource<TResult> son seguros para subprocesos y se pueden usar desde varios subprocesos simultáneamente.

Volver al principio
Mostrar: