Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo TaskFactory.StartNew (Action, CancellationToken)

 

Data di pubblicazione: ottobre 2016

Crea e avvia un oggetto Task.

Spazio dei nomi:   System.Threading.Tasks
Assembly:  mscorlib (in mscorlib.dll)

public Task StartNew(
	Action action,
	CancellationToken cancellationToken
)

Parametri

action
Type: System.Action

Delegato dell'azione da eseguire in modo asincrono.

cancellationToken
Type: System.Threading.CancellationToken

Oggetto CancellationToken che verrà assegnato alla nuova attività.

Valore restituito

Type: System.Threading.Tasks.Task

Oggetto Task avviato.

Exception Condition
ObjectDisposedException

Provider CancellationToken già eliminato.

ArgumentNullException

L'eccezione generata quando il action argomento è null.

La chiamata a StartNew è funzionalmente equivalente alla creazione di un'attività utilizzando uno dei relativi costruttori e quindi chiamando Start per pianificarne l'esecuzione.

A partire dal .NET Framework 4.5, è possibile utilizzare il Task.Run(Action, CancellationToken) in modo rapido per chiamare il metodo StartNew(Action, CancellationToken) con parametri predefiniti. Si noti, tuttavia, che vi sia una differenza nel comportamento tra i due metodi per quanto riguarda: Task.Run(Action, CancellationToken) per impostazione predefinita non consente figlio attività avviate con il TaskCreationOptions.AttachedToParent opzione per il collegamento all'oggetto corrente Task istanza, mentre StartNew(Action, CancellationToken) viene. Per ulteriori informazioni ed esempi di codice, vedere Task.Run vs Task.Factory.StartNew in parallelo blog sulla programmazione con .NET.

Nell'esempio seguente viene chiamato il StartNew(Action, CancellationToken) metodo per creare un'attività che consente di scorrere i file nella directory C:\Windows\System32. L'espressione lambda chiama il Parallel.ForEach<TSource> metodo per aggiungere informazioni su ogni file a un List<T> oggetto. Ogni scollegato attività annidata richiamato da di Parallel.ForEach<TSource> ciclo controlla lo stato del token di annullamento e, se viene richiesto l'annullamento, chiama il CancellationToken.ThrowIfCancellationRequested metodo. Il CancellationToken.ThrowIfCancellationRequested genererà un OperationCanceledException eccezione gestita in un catch blocco quando il thread chiamante chiama il Task.Wait metodo.

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

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 4.0
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 5.0
Windows Phone Silverlight
Disponibile da 8.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: