Task.FromResult<TResult>(TResult) Método

Definição

Cria um Task<TResult> que é concluído com êxito com o resultado especificado.

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

Parâmetros de tipo

TResult

O tipo de resultado retornado pela tarefa.

Parâmetros

result
TResult

O resultado a armazenar na tarefa concluída.

Retornos

Task<TResult>

A tarefa concluída com êxito.

Exemplos

O exemplo a seguir é um utilitário de linha de comando que calcula o número de bytes nos arquivos em cada diretório cujo nome é passado como um argumento de linha de comando. Em vez de executar um caminho de código mais longo que instancia um FileStream objeto e recupera o valor de sua FileStream.Length propriedade para cada arquivo no diretório, o exemplo simplesmente chama o FromResult método para criar uma tarefa cuja Task<TResult>.Result propriedade é zero (0) se um diretório não tiver arquivos.

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

Comentários

Esse método cria um Task<TResult> objeto cuja Task<TResult>.Result propriedade é result e cuja Status propriedade é RanToCompletion. O método é comumente usado quando o valor retornado de uma tarefa é imediatamente conhecido sem executar um caminho de código mais longo. O exemplo fornece uma ilustração.

Para criar um Task objeto que não retorna um valor, recupere o Task objeto da CompletedTask propriedade.

A partir do .NET 6, para alguns T tipos e alguns valores de resultado, esse método pode retornar um objeto singleton armazenado em cache em vez de alocar um novo objeto.

Aplica-se a

Confira também