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 Task.FromException<TResult>(Exception)

 

Data di pubblicazione: ottobre 2016

Crea un oggetto Task<TResult> che risulta completato con un'eccezione specificata.

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

public static Task<TResult> FromException<TResult>(
	Exception exception
)

Parametri

exception
Type: System.Exception

Eccezione con cui completare l'attività.

Valore restituito

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

Attività in errore.

Parametri tipo

TResult

Tipo del risultato restituito dall'attività.

Questo metodo crea un Task<TResult> il cui Status è TaskStatus.Faulted e il cui Exception contiene proprietà exception. Il metodo viene comunemente utilizzato quando è possibile sapere immediatamente che il lavoro che esegue un'attività verrà generata un'eccezione prima di eseguire un percorso di codice più lungo. Nell'esempio viene illustrata una situazione di questo tipo.

Nell'esempio seguente è un'utilità della riga di comando che calcola il numero di byte nei file in ogni directory il cui nome viene passato come argomento della riga di comando. Anziché un percorso più lungo di codice che crea un'istanza in esecuzione un FileInfo dell'oggetto e recupera il valore della relativa FileInfo.Length proprietà per ogni file nella directory, l'esempio chiama semplicemente il FromException<TResult>(Exception) metodo per creare un'attività con errore se non esiste una sottodirectory specifica.

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

public class Example
{
   public static void Main()
   {
      string[] args = Environment.GetCommandLineArgs();
      if (args.Length > 1) {
         List<Task<long>> tasks = new List<Task<long>>();
         for (int ctr = 1; ctr < args.Length; ctr++)
            tasks.Add(GetFileLengthsAsync(args[ctr]));

         try {
            Task.WaitAll(tasks.ToArray());
         }
         // Ignore exceptions here.
         catch (AggregateException) {}

         for (int ctr = 0 ; ctr < tasks.Count; ctr++) {
            if (tasks[ctr].Status == TaskStatus.Faulted)
               Console.WriteLine("{0} does not exist", args[ctr + 1]);
            else
               Console.WriteLine("{0:N0} bytes in files in '{1}'",
                                 tasks[ctr].Result, args[ctr + 1]);
         }
      }
      else {
         Console.WriteLine("Syntax error: Include one or more file paths.");
      }
   }

   private static Task<long> GetFileLengthsAsync(string filePath)
   {
      if (! Directory.Exists(filePath)) {
         return Task.FromException<long>(
                     new DirectoryNotFoundException("Invalid directory name."));
      }
      else {
         string[] files = Directory.GetFiles(filePath);
         if (files.Length == 0)
            return Task.FromResult(0L);
         else
            return Task.Run( () => { long total = 0;
                                     Parallel.ForEach(files, (fileName) => {
                                                 var fs = new FileStream(fileName, FileMode.Open,
                                                                         FileAccess.Read, FileShare.ReadWrite,
                                                                         256, true);
                                                 long length = fs.Length;
                                                 Interlocked.Add(ref total, length);
                                                 fs.Close(); } );
                                     return total;
                                   } );
      }
   }
}
// When launched with the following command line arguments:
//      subdir . newsubdir
// the example displays output like the following:
//       0 bytes in files in 'subdir'
//       2,059 bytes in files in '.'
//       newsubdir does not exist

Universal Windows Platform
Disponibile da 10
.NET Framework
Disponibile da 4.6
Torna all'inizio
Mostra: