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

Método TaskFactory.StartNew<TResult>(Func<TResult>)

 

Publicado: octubre de 2016

Crea e inicia un objeto Task<TResult>.

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

public Task<TResult> StartNew<TResult>(
	Func<TResult> function
)

Parámetros

function
Type: System.Func<TResult>

Delegado de función que devuelve el resultado futuro que va a estar disponible a través de Task<TResult>.

Valor devuelto

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

Objeto Task<TResult> iniciado.

Parámetros de tipo

TResult

Tipo del resultado que está disponible a través de Task<TResult>.

Exception Condition
ArgumentNullException

El argumento function es null.

Llamar a StartNew<TResult> es funcionalmente equivalente a la creación de un Task<TResult> utilizando uno de sus constructores y, a continuación, llamar a Start para programar su ejecución.

A partir de la .NET Framework 4.5, puede llamar a la Task.Run<TResult>(Func<TResult>) método como una forma rápida de llamar a StartNew con parámetros predeterminados. Sin embargo, tenga en cuenta que hay una diferencia de comportamiento entre los dos métodos en relación con: Task.Run<TResult>(Func<TResult>) de forma predeterminada no permite secundarios tareas iniciadas con el TaskCreationOptions.AttachedToParent opción para adjuntar a la actual Task<TResult> instancia, mientras que StartNew<TResult>(Func<TResult>) does. Para obtener más información y ejemplos de código, vea la entrada Task.Run vs. Task.Factory.StartNew en el blog Parallel Programming with .NET.

En el siguiente ejemplo es una aplicación de adición simple que genera dos números aleatorios y pide al usuario que escriba su suma. A continuación, indica si la respuesta es correcta o, si la respuesta del usuario no es un número válido, pide al usuario que vuelva a escribir un número válido. El StartNew<TResult> se utiliza para crear la Task<TResult> los objetos que devuelven los números aleatorios para agregar.

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      Task<int>[] tasks = new Task<int>[2];
      Object obj = new Object();

      while (true) {
         for (int ctr = 0; ctr <= 1; ctr++)
            tasks[ctr] = Task.Factory.StartNew(() => { int i = 0;
                                                       lock(obj) {
                                                          i = rnd.Next(101);
                                                       }
                                                       return i; });

         Task.WaitAll(tasks);
         int n1 = tasks[0].Result;
         int n2 = tasks[1].Result;
         int result = n1 + n2;
         bool validInput = false;
         while (! validInput) {
            ShowMessage(n1, n2);
            string userInput = Console.ReadLine();
            // Process user input.
            if (userInput.Trim().ToUpper() == "X") return;
            int answer;
            validInput = Int32.TryParse(userInput, out answer);
            if (! validInput)
               Console.WriteLine("Invalid input. Try again, but enter only numbers. ");
            else if (answer == result)
               Console.WriteLine("Correct!");
            else
               Console.WriteLine("Incorrect. The correct answer is {0}.", result);
         }
      }
   }

   private static void ShowMessage(int n1, int n2)
   {
      Console.WriteLine("\nEnter 'x' to exit...");
      Console.Write("{0} + {1} = ", n1, n2);
   }
}
// The example displays the following output:
//       Enter 'x' to exit...
//       15 + 11 = 26
//       Correct!
//
//       Enter 'x' to exit...
//       75 + 33 = adc
//       Invalid input. Try again, but enter only numbers.
//
//       Enter 'x' to exit...
//       75 + 33 = 108
//       Correct!
//
//       Enter 'x' to exit...
//       67 + 55 = 133
//       Incorrect. The correct answer is 122.
//
//       Enter 'x' to exit...
//       92 + 51 = 133
//       Incorrect. The correct answer is 143.
//
//       Enter 'x' to exit...
//       81 + 65 = x

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: