Task.FromResult<TResult>(TResult) Metodo

Definizione

Crea un Task<TResult> che viene completato correttamente con il risultato specificato.

public static System.Threading.Tasks.Task<TResult> FromResult<TResult> (TResult result);

Parametri di tipo

TResult

Tipo del risultato restituito dall'attività.

Parametri

result
TResult

Risultato da archiviare nell'attività completata.

Restituisce

Task<TResult>

Attività completata correttamente.

Esempio

L'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é eseguire un percorso di codice più lungo che crea un'istanza di un FileStream oggetto e recupera il valore della relativa FileStream.Length proprietà per ogni file nella directory, l'esempio chiama semplicemente il FromResult metodo per creare un'attività la cui Task<TResult>.Result proprietà è zero (0) se una directory non contiene file.

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

Commenti

Questo metodo crea un Task<TResult> oggetto la cui Task<TResult>.Result proprietà è result e la cui Status proprietà è RanToCompletion. Il metodo viene comunemente usato quando il valore restituito di un'attività è immediatamente noto senza eseguire un percorso di codice più lungo. Nell'esempio viene illustrata una situazione di questo tipo.

Per creare un Task oggetto che non restituisce un valore, recuperare l'oggetto Task dalla CompletedTask proprietà .

A partire da .NET 6, per alcuni T tipi e alcuni valori dei risultati, questo metodo può restituire un oggetto singleton memorizzato nella cache anziché allocare un nuovo oggetto.

Si applica a

Vedi anche