ContinueWith(TResult) Método (Func(Task, TResult), CancellationToken, TaskContinuationOptions, TaskScheduler)
TOC
Collapse the table of content
Expand the table of content
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

Task.ContinueWith<TResult> (Método) (Func<Task, TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

 

Crea una continuación que se ejecuta según las opciones de continuación especificadas y devuelve un valor.Se pasa un token de cancelación a la continuación y usa un programador especificado.

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

public Task<TResult> ContinueWith<TResult>(
	Func<Task, TResult> continuationFunction,
	CancellationToken cancellationToken,
	TaskContinuationOptions continuationOptions,
	TaskScheduler scheduler
)

Parámetros

continuationFunction

Función que se ejecuta según la condición especificada en continuationOptions.. Cuando se ejecute, al delegado se le pasará la tarea completada como un argumento.

cancellationToken

El CancellationToken que se asignará a la nueva tarea de continuación.

continuationOptions

Opciones para la programación y el comportamiento de la continuación.Incluye criterios, como OnlyOnCanceled, y opciones de ejecución, como ExecuteSynchronously.

scheduler

Objeto TaskScheduler que se va a asociar a la tarea de continuación y se va a usar para su ejecución.

Valor devuelto

Type: System.Threading.Tasks.Task<TResult>

Nuevo objeto Task<TResult> de continuación.

Parámetros de tipo

TResult

Tipo de resultado generado por la continuación.

Exception Condition
ObjectDisposedException

Se ha eliminado Task.

-o-

El CancellationTokenSource que creó el token ya se ha eliminado.

ArgumentNullException

El continuationFunction el argumento es null.

-o-

El scheduler el argumento es null.

ArgumentOutOfRangeException

El continuationOptions argumento especifica un valor no válido para TaskContinuationOptions.

El valor devuelto Task<TResult> no se programará para su ejecución hasta que finalice la tarea actual.Si los criterios especifican a través de la continuationOptions parámetro no se cumplen, la tarea de continuación se cancelará en lugar de programarse.

En el ejemplo siguiente se muestra cómo utilizar el método ContinueWith con opciones de continuación:

using System;
using System.Threading;
using System.Threading.Tasks;

class ContinuationOptionsDemo
{
    // Demonstrated features:
    //      TaskContinuationOptions
    //		Task.ContinueWith()
    // 		Task.Factory
    //		Task.Wait()
    // Expected results:
    // 		This sample demonstrates branched continuation sequences - Task+Commit or Task+Rollback.
    //      Notice that no if statements are used.
    //		The first sequence is successful - tran1 and commitTran1 are executed. rollbackTran1 is canceled.
    //		The second sequence is unsuccessful - tran2 and rollbackTran2 are executed. tran2 is faulted, and commitTran2 is canceled.
    // Documentation:
    //		http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions(VS.100).aspx
    static void Main()
    {
        Action success = () => Console.WriteLine("Task={0}, Thread={1}: Begin successful transaction",
                                                Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
        Action failure = () =>
        {
            Console.WriteLine("Task={0}, Thread={1}: Begin transaction and encounter an error",
                                Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
            throw new InvalidOperationException("SIMULATED EXCEPTION");
        };

        Action<Task> commit = (antecendent) => Console.WriteLine("Task={0}, Thread={1}: Commit transaction",
                                                                Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
        Action<Task> rollback = (antecendent) =>
        {
            // "Observe" your antecedent's exception so as to avoid an exception
            // being thrown on the finalizer thread
            var unused = antecendent.Exception;

            Console.WriteLine("Task={0}, Thread={1}: Rollback transaction",
                  Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
        };

        // Successful transaction - Begin + Commit
        Console.WriteLine("Demonstrating a successful transaction");

        // Initial task
        // Treated as "fire-and-forget" -- any exceptions will be cleaned up in rollback continuation
        Task tran1 = Task.Factory.StartNew(success);

        // The following task gets scheduled only if tran1 completes successfully
        var commitTran1 = tran1.ContinueWith(commit, TaskContinuationOptions.OnlyOnRanToCompletion);

        // The following task gets scheduled only if tran1 DOES NOT complete successfully
        var rollbackTran1 = tran1.ContinueWith(rollback, TaskContinuationOptions.NotOnRanToCompletion);

        // For demo purposes, wait for the sample to complete
        commitTran1.Wait();

        // -----------------------------------------------------------------------------------


        // Failed transaction - Begin + exception + Rollback
        Console.WriteLine("\nDemonstrating a failed transaction");

        // Initial task
        // Treated as "fire-and-forget" -- any exceptions will be cleaned up in rollback continuation
        Task tran2 = Task.Factory.StartNew(failure);

        // The following task gets scheduled only if tran2 completes successfully
        var commitTran2 = tran2.ContinueWith(commit, TaskContinuationOptions.OnlyOnRanToCompletion);

        // The following task gets scheduled only if tran2 DOES NOT complete successfully
        var rollbackTran2 = tran2.ContinueWith(rollback, TaskContinuationOptions.NotOnRanToCompletion);

        // For demo purposes, wait for the sample to complete
        rollbackTran2.Wait();
    }

}
This snippet ID 04 is used in multiple files: /vb/continuewhenmulti.vb, /vb/continuationoptions.vb. Rename the duplicate ID to make it unique, and update the reference to the snippet ID in the topic(s).

Universal Windows Platform
Disponible desde 4.5
.NET Framework
Disponible desde 4.0
Portable Class Library
Compatible con: portable .NET platforms
Silverlight
Disponible desde 5.0
Windows Phone Silverlight
Disponible desde 8.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar:
© 2016 Microsoft