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.RunSynchronously ()

 

Publicado: noviembre de 2016

Ejecuta sincrónicamente el objeto Task en el objeto TaskScheduler actual.

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

public void RunSynchronously()

Exception Condition
ObjectDisposedException

Se eliminó la instancia de Task.

InvalidOperationException

Task no se encuentra en un estado válido para iniciarse. Puede que ya se iniciase, se ejecutase o se cancelase, o puede que se crease de una manera que no admite la programación directa.

Normalmente, las tareas se ejecutan de forma asincrónica en un subproceso del grupo y no bloquean el subproceso de llamada. Las tareas ejecutadas llamando el RunSynchronously() están asociados con el actual método TaskScheduler y se ejecutan en el subproceso de llamada. Si el programador de destino no admite la ejecución de esta tarea en el subproceso que realiza la llamada, la tarea se programará para su ejecución en el programador y el subproceso de llamada se bloqueará hasta que la tarea ha completado su ejecución. Aunque la tarea se ejecuta de forma sincrónica, el subproceso de llamada debe llamar a Wait para controlar las excepciones que puede iniciar la tarea. Para obtener más información sobre el control de excepciones, consulte Control de excepciones (Task Parallel Library).

Las tareas ejecutadas llamando el RunSynchronously se crea una instancia de método mediante una llamada a un Task o Task<TResult> constructor de clase. La tarea se ejecute sincrónicamente debe estar en el TaskStatus.Created estado. Una tarea se puede iniciar y ejecutar solo una vez. Los intentos para programar una tarea en un segundo tiempo da como resultado una excepción.

El ejemplo siguiente compara una tarea que se ejecuta llamando a la RunSynchronously método con una ejecución asincrónica. En ambos casos, las tareas ejecutan expresiones lambda idénticos que se muestran el identificador de tarea y el identificador del subproceso en el que se ejecuta la tarea. La tarea calcula la suma de los números enteros entre 1 y 1.000.000. Como se muestra en el resultado del ejemplo, la tarea se ejecuta llamando a la RunSynchronously método se ejecuta en el subproceso de la aplicación, mientras que la tarea asincrónica no.

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

public class Example
{
   public static void Main()
   {
      Console.WriteLine("Application executing on thread {0}",
                        Thread.CurrentThread.ManagedThreadId);
      var asyncTask = Task.Run( () => {  Console.WriteLine("Task {0} (asyncTask) executing on Thread {1}",
                                                           Task.CurrentId,
                                                           Thread.CurrentThread.ManagedThreadId);
                                         long sum = 0;
                                         for (int ctr = 1; ctr <= 1000000; ctr++ )
                                            sum += ctr;
                                         return sum;
                                      });
      var syncTask = new Task<long>( () =>  { Console.WriteLine("Task {0} (syncTask) executing on Thread {1}",
                                                                 Task.CurrentId,
                                                                 Thread.CurrentThread.ManagedThreadId);
                                              long sum = 0;
                                              for (int ctr = 1; ctr <= 1000000; ctr++ )
                                                 sum += ctr;
                                              return sum;
                                            });
      syncTask.RunSynchronously();
      Console.WriteLine();
      Console.WriteLine("Task {0} returned {1:N0}", syncTask.Id, syncTask.Result);
      Console.WriteLine("Task {0} returned {1:N0}", asyncTask.Id, asyncTask.Result);
   }
}
// The example displays the following output:
//       Application executing on thread 1
//       Task 1 (syncTask) executing on Thread 1
//       Task 2 (asyncTask) executing on Thread 3
//       1 status: RanToCompletion
//       2 status: RanToCompletion
//
//       Task 2 returned 500,000,500,000
//       Task 1 returned 500,000,500,000

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: