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 Task.Run (Action)

.NET Framework (current version)
 

Publicado: octubre de 2016

Pone en cola el trabajo especificado para ejecutarlo en el grupo de subprocesos y devuelve un objeto Task que representa ese trabajo.

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

public static Task Run(
	Action action
)

Parámetros

action
Type: System.Action

Trabajo que se va a ejecutar de forma asincrónica.

Valor devuelto

Type: System.Threading.Tasks.Task

Tarea que representa el trabajo en cola para ejecutarse en ThreadPool.

Exception Condition
ArgumentNullException

El parámetro action era null.

The M:System.Threading.Tasks.Task.Run(System.Action) method allows you to create and execute a task in a single method call and is a simpler alternative to the M:System.Threading.Tasks.TaskFactory.StartNew(System.Action) method. It creates a task with the following default values:

  • Its cancellation token is P:System.Threading.CancellationToken.None.

  • Its P:System.Threading.Tasks.Task.CreationOptions property value is F:System.Threading.Tasks.TaskCreationOptions.DenyChildAttach.

  • It uses the default task scheduler.

For information on handling exceptions thrown by task operations, see Exception Handling (Task Parallel Library).

The following example defines a ShowThreadInfo method that displays the P:System.Threading.Thread.ManagedThreadIdof the current thread. It is called directly from the application thread, and is called from the T:System.Action delegate passed to the M:System.Threading.Tasks.Task.Run(System.Action) method.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      ShowThreadInfo("Application");

      var t = Task.Run(() => ShowThreadInfo("Task") );
      t.Wait();
   }

   static void ShowThreadInfo(String s)
   {
      Console.WriteLine("{0} Thread ID: {1}",
                        s, Thread.CurrentThread.ManagedThreadId);
   }
}
// The example displays the following output:
//       Application thread ID: 1
//       Task thread ID: 3

The following example is similar to the previous one, except that it uses a lambda expression to define the code that the task is to execute.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Console.WriteLine("Application thread ID: {0}",
                        Thread.CurrentThread.ManagedThreadId);
      var t = Task.Run(() => {  Console.WriteLine("Task thread ID: {0}",
                                   Thread.CurrentThread.ManagedThreadId);
                             } );
      t.Wait();
   }
}
// The example displays the following output:
//       Application thread ID: 1
//       Task thread ID: 3

The examples show that the asynchronous task executes on a different thread than the main application thread.

The call to the M:System.Threading.Tasks.Task.Wait method ensures that the task completes and displays its output before the application ends. Otherwise, it is possible that the Main method will complete before the task finishes.

The following example illustrates the M:System.Threading.Tasks.Task.Run(System.Action) method. It defines an array of directory names and starts a separate task to retrieve the file names in each directory. All tasks write the file names to a single T:System.Collections.Concurrent.ConcurrentBag`1 object. The example then calls the M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[]) method to ensure that all tasks have completed, and then displays a count of the total number of file names written to the T:System.Collections.Concurrent.ConcurrentBag`1 object.

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

public class Example
{
   public static void Main()
   {
      var list = new ConcurrentBag<string>();
      string[] dirNames = { ".", ".." };
      List<Task> tasks = new List<Task>();
      foreach (var dirName in dirNames) {
         Task t = Task.Run( () => { foreach(var path in Directory.GetFiles(dirName)) 
                                       list.Add(path); }  );
         tasks.Add(t);
      }
      Task.WaitAll(tasks.ToArray());
      foreach (Task t in tasks)
         Console.WriteLine("Task {0} Status: {1}", t.Id, t.Status);

      Console.WriteLine("Number of files read: {0}", list.Count);
   }
}
// The example displays output like the following:
//       Task 1 Status: RanToCompletion
//       Task 2 Status: RanToCompletion
//       Number of files read: 23

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 4.5
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Windows Phone Silverlight
Disponible desde 8.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: