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

Constructor Task<TResult>(Func<TResult>)

 

Publicado: octubre de 2016

Inicializa una nueva Task<TResult> con la función especificada.

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

public Task(
	Func<TResult> function
)

Parámetros

function
Type: System.Func<TResult>

Delegado que representa el código que se va a ejecutar en la tarea. Cuando se complete la función, se establecerá la propiedad Result de la tarea para que se devuelva el valor de resultado de la función.

Exception Condition
ArgumentNullException

El argumento function es null.

En lugar de llamar a este constructor, la manera más común para crear instancias de un Task<TResult> objeto e inicie una tarea que se está llamando a estático Task.Run<TResult>(Func<TResult>) y TaskFactory<TResult>.StartNew(Func<TResult>) métodos. La única ventaja que ofrece este constructor es que permite la creación de instancias de objeto se separa de la invocación de la tarea.

En el ejemplo siguiente se cuenta el número aproximado de palabras en los archivos de texto que representan libros publicados. Cada tarea es responsable de abrir un archivo, leer todo su contenido de forma asincrónica y calcular el recuento de palabras mediante una expresión regular. El Task.WaitAll(Task[]) se invoca para asegurarse de que todas las tareas se han completado antes de mostrar el recuento de palabras de cada libro en la consola.

Creación de instancias de objeto se separa de la ejecución del objeto en este ejemplo para que el ejemplo asegurarse de que cada archivo existe. Si no lo hace, muestra el nombre del archivo que falta. De lo contrario, llama a la Task.Start método para iniciar cada tarea.

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      string pattern = @"\p{P}*\s+";
      string[] titles = { "Sister Carrie", "The Financier" };
      Task<int>[] tasks = new Task<int>[titles.Length];

      for (int ctr = 0; ctr < titles.Length; ctr++) {
         string s = titles[ctr];
         tasks[ctr] = new Task<int>( () => {
                                   // Number of words.
                                   int nWords = 0;
                                   // Create filename from title.
                                   string fn = s + ".txt";

                                   StreamReader sr = new StreamReader(fn);
                                   string input = sr.ReadToEndAsync().Result;
                                   sr.Close();
                                   nWords = Regex.Matches(input, pattern).Count;
                                   return nWords;
                                } );
      }
      // Ensure files exist before launching tasks.
      bool allExist = true;
      foreach (var title in titles) {
         string fn = title + ".txt";
         if (! File.Exists(fn)) {
            allExist = false;
            Console.WriteLine("Cannot find '{0}'", fn);
            break;
         }   
      }
      // Launch tasks 
      if (allExist) {
         foreach (var t in tasks)
            t.Start();

        Task.WaitAll(tasks);

        Console.WriteLine("Word Counts:\n");
        for (int ctr = 0; ctr < titles.Length; ctr++)
           Console.WriteLine("{0}: {1,10:N0} words", titles[ctr], tasks[ctr].Result);
      }   
   }
}
// The example displays the following output:
//       Sister Carrie:    159,374 words
//       The Financier:    196,362 words

The regular expression pattern \p{P}*\s+ matches zero, one, or more punctuation characters followed by one or more whitespace characters. It assumes that the total number of matches equals the approximate word count.

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: