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

Método TaskFactory.StartNew (Action, CancellationToken)

 

Publicado: octubre de 2016

Crea e inicia un objeto Task.

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

public Task StartNew(
	Action action,
	CancellationToken cancellationToken
)

Parámetros

action
Type: System.Action

Delegado de acción que se va a ejecutar de forma asincrónica.

cancellationToken
Type: System.Threading.CancellationToken

El CancellationToken al que se va a asignar la nueva tarea.

Valor devuelto

Type: System.Threading.Tasks.Task

Objeto Task iniciado.

Exception Condition
ObjectDisposedException

Ya se eliminó el CancellationToken proporcionado.

ArgumentNullException

La excepción que se produce cuando el action del argumento es null.

Llamar a StartNew es funcionalmente equivalente a la creación de una tarea mediante uno de sus constructores y, a continuación, llamar al método Start para programar su ejecución.

A partir de la .NET Framework 4.5, puede utilizar el Task.Run(Action, CancellationToken) método como una forma rápida de llamar a StartNew(Action, CancellationToken) con parámetros predeterminados. Sin embargo, tenga en cuenta que hay una diferencia de comportamiento entre los dos métodos en relación con: Task.Run(Action, CancellationToken) de forma predeterminada no permite secundarios tareas iniciadas con el TaskCreationOptions.AttachedToParent opción para adjuntar a la actual Task instancia, mientras que StartNew(Action, CancellationToken) does. Para obtener más información y ejemplos de código, consulte Task.Run vs Task.Factory.StartNew en el blog Parallel Programming with .NET.

El ejemplo siguiente se llama el StartNew(Action, CancellationToken) método para crear una tarea que recorre en iteración los archivos en el directorio C:\Windows\System32. La expresión lambda llama el Parallel.ForEach<TSource> para agregar información acerca de cada archivo a un List<T> objeto. Cada uno separado tarea anidada que se invoca el Parallel.ForEach<TSource> bucle comprueba el estado del token de cancelación y, si se solicita la cancelación, llama a la CancellationToken.ThrowIfCancellationRequested (método). El CancellationToken.ThrowIfCancellationRequested método produce un OperationCanceledException excepción que se controla en un catch bloquear cuando el subproceso que realiza la llamada llama la Task.Wait (método).

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      var tokenSource = new CancellationTokenSource();
      var token = tokenSource.Token;
      var files = new List<Tuple<string, string, long, DateTime>>();

      var t = Task.Factory.StartNew( () => { string dir = "C:\\Windows\\System32\\";
                                object obj = new Object();
                                if (Directory.Exists(dir)) {
                                   Parallel.ForEach(Directory.GetFiles(dir),
                                   f => {
                                           if (token.IsCancellationRequested)
                                              token.ThrowIfCancellationRequested();
                                           var fi = new FileInfo(f);
                                           lock(obj) {
                                              files.Add(Tuple.Create(fi.Name, fi.DirectoryName, fi.Length, fi.LastWriteTimeUtc));          
                                           }
                                      });
                                 }
                              }
                        , token);
      tokenSource.Cancel();
      try {
         t.Wait(); 
         Console.WriteLine("Retrieved information for {0} files.", files.Count);
      }
      catch (AggregateException e) {
         Console.WriteLine("Exception messages:");
         foreach (var ie in e.InnerExceptions)
            Console.WriteLine("   {0}: {1}", ie.GetType().Name, ie.Message);

         Console.WriteLine("\nTask status: {0}", t.Status);       
      }
      finally {
         tokenSource.Dispose();
      }
   }
}
// The example displays the following output:
//       Exception messages:
//          TaskCanceledException: A task was canceled.
//       
//       Task status: Canceled

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
Volver al principio
Mostrar: