Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo Task.RunSynchronously ()

 

Data di pubblicazione: novembre 2016

Esegue Task in modo sincrono nell'oggetto TaskScheduler corrente.

Spazio dei nomi:   System.Threading.Tasks
Assembly:  mscorlib (in mscorlib.dll)

public void RunSynchronously()

Exception Condition
ObjectDisposedException

L’istanza di Task è stata eliminata.

InvalidOperationException

Task non è in uno stato valido per essere avviato. Potrebbe essere già stato avviato, eseguito o annullato oppure potrebbe essere stato creato in un modo che non supporta la pianificazione diretta.

In genere, le attività vengono eseguite in modo asincrono in un pool di thread e non blocca il thread chiamante. Attività eseguita chiamando il RunSynchronously() metodo associati corrente TaskScheduler e vengono eseguiti nel thread chiamante. Se l'utilità di pianificazione di destinazione non supporta l'esecuzione di questa attività nel thread chiamante, l'attività verrà pianificata per l'esecuzione nell'utilità di pianificazione e il thread chiamante si bloccherà fino a quando l'attività ha completato l'esecuzione. Anche se l'operazione viene eseguita in modo sincrono, il thread chiamante deve chiamare ancora Wait per gestire le eccezioni che potrebbe generare l'attività. Per ulteriori informazioni sulla gestione delle eccezioni, vedere Gestione delle eccezioni (Task Parallel Library).

Le attività eseguite tramite la chiamata di RunSynchronously viene creata un'istanza di metodo chiamando un Task o Task<TResult> costruttore della classe. L'attività da eseguire in modo sincrono deve essere nel TaskStatus.Created dello stato. Un'attività può essere avviata ed eseguita una sola volta. Qualsiasi tentativo di pianificare un'attività determina un tempo secondo un'eccezione.

Nell'esempio seguente vengono confrontate un'attività eseguita chiamando il RunSynchronously metodo con uno eseguita in modo asincrono. In entrambi i casi, le attività eseguite le espressioni lambda identici che consentono di visualizzare l'ID attività e l'ID del thread su cui viene eseguito l'attività. L'attività calcola la somma dei valori integer compreso tra 1 e 1.000.000. Come illustrato nell'output dell'esempio, l'attività eseguita chiamando il RunSynchronously metodo viene eseguito sul thread dell'applicazione, contrariamente all'attività asincrona.

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

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 4.0
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 5.0
Windows Phone Silverlight
Disponibile da 8.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: