Task.RunSynchronously Метод

Определение

Синхронно выполняет задачу Task в текущем планировщике TaskScheduler.Runs the Task synchronously on the current TaskScheduler.

Перегрузки

RunSynchronously()

Синхронно выполняет задачу Task в текущем планировщике TaskScheduler.Runs the Task synchronously on the current TaskScheduler.

RunSynchronously(TaskScheduler)

Синхронно выполняет задачу Task в предоставленном планировщике TaskScheduler.Runs the Task synchronously on the TaskScheduler provided.

RunSynchronously()

Синхронно выполняет задачу Task в текущем планировщике TaskScheduler.Runs the Task synchronously on the current TaskScheduler.

public:
 void RunSynchronously();
public void RunSynchronously ();
member this.RunSynchronously : unit -> unit
Public Sub RunSynchronously ()

Исключения

Экземпляр Task удален.The Task instance has been disposed.

Задача Task не находится в допустимом состоянии для запуска.The Task is not in a valid state to be started. Возможно, она уже запущена, выполнена или отменена, или она была создана способом, не поддерживающим прямое планирование.It may have already been started, executed, or canceled, or it may have been created in a manner that doesn't support direct scheduling.

Примеры

В следующем примере сравнивается задача, выполняемая путем вызова метода RunSynchronously с одним асинхронным выполнением.The following example compares a task executed by calling the RunSynchronously method with one executed asynchronously. В обоих случаях задачи выполняют идентичные лямбда-выражения, отображающие идентификатор задачи и идентификатор потока, в котором выполняется задача.In both cases, the tasks execute identical lambda expressions that display the task ID and the ID of the thread on which the task is running. Задача вычисляет сумму целых чисел от 1 до 1 000 000.The task calculates the sum of the integers between 1 and 1,000,000. Как видно из выходных данных в примере, задача, выполняемая путем вызова метода RunSynchronously, выполняется в потоке приложения, а асинхронная задача — нет.As the output from the example shows, the task executed by calling the RunSynchronously method runs on the application thread, while the asynchronous task does not.

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
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Console.WriteLine("Application executing on thread {0}",
                        Thread.CurrentThread.ManagedThreadId)
      Dim asyncTask = Task.Run( Function()
                                   Console.WriteLine("Task {0} (asyncTask) executing on Thread {1}",
                                                     Task.CurrentId,
                                                     Thread.CurrentThread.ManagedThreadId)
                                   Dim sum As Long = 0
                                   For ctr As Integer = 1 To 1000000
                                      sum += ctr
                                   Next
                                   Return sum
                                End Function)
      Dim syncTask As New Task(Of Long)( Function()
                                            Console.WriteLine("Task {0} (syncTask) executing on Thread {1}",
                                                              Task.CurrentId,
                                                              Thread.CurrentThread.ManagedThreadId)
                                            Dim sum As Long = 0
                                            For ctr As Integer = 1 To 1000000
                                               sum += ctr
                                            Next
                                            Return sum
                                         End Function)
      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)
   End Sub
End Module
' 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

Комментарии

Обычно задачи выполняются асинхронно в потоке пула потоков и не блокируют вызывающий поток.Ordinarily, tasks are executed asynchronously on a thread pool thread and do not block the calling thread. Задачи, выполняемые путем вызова метода RunSynchronously(), связаны с текущим TaskScheduler и выполняются в вызывающем потоке.Tasks executed by calling the RunSynchronously() method are associated with the current TaskScheduler and are run on the calling thread. Если целевой планировщик не поддерживает выполнение этой задачи в вызывающем потоке, задача будет запланирована на выполнение в планировщике, а вызывающий поток будет заблокирован до завершения выполнения задачи.If the target scheduler does not support running this task on the calling thread, the task will be scheduled for execution on the scheduler, and the calling thread will block until the task has completed execution. Несмотря на то, что задача выполняется синхронно, вызывающий поток по-прежнему должен вызывать Wait для обработки исключений, которые может вызывать задача.Even though the task runs synchronously, the calling thread should still call Wait to handle any exceptions that the task might throw. Дополнительные сведения об обработке исключений см. в разделе обработка исключений.For more information on exception handling, see Exception Handling.

Задачи, выполняемые путем вызова метода RunSynchronously, создаются путем вызова конструктора класса Task или Task<TResult>.Tasks executed by calling the RunSynchronously method are instantiated by calling a Task or Task<TResult> class constructor. Задача, запускаемая синхронно, должна находиться в состоянии Created.The task to be run synchronously must be in the Created state. Задача может быть запущена и запущена только один раз.A task may be started and run only once. Любые попытки запланировать задачу во второй раз приводят к исключению.Any attempts to schedule a task a second time results in an exception.

Дополнительно

RunSynchronously(TaskScheduler)

Синхронно выполняет задачу Task в предоставленном планировщике TaskScheduler.Runs the Task synchronously on the TaskScheduler provided.

public:
 void RunSynchronously(System::Threading::Tasks::TaskScheduler ^ scheduler);
public void RunSynchronously (System.Threading.Tasks.TaskScheduler scheduler);
member this.RunSynchronously : System.Threading.Tasks.TaskScheduler -> unit
Public Sub RunSynchronously (scheduler As TaskScheduler)

Параметры

scheduler
TaskScheduler

Планировщик, в котором следует попытаться выполнить задачу.The scheduler on which to attempt to run this task inline.

Исключения

Экземпляр Task удален.The Task instance has been disposed.

Аргумент scheduler имеет значение null.The scheduler argument is null.

Задача Task не находится в допустимом состоянии для запуска.The Task is not in a valid state to be started. Возможно, она уже запущена, выполнена или отменена, или она была создана способом, не поддерживающим прямое планирование.It may have already been started, executed, or canceled, or it may have been created in a manner that doesn't support direct scheduling.

Комментарии

Задачи, выполняемые путем вызова метода RunSynchronously, создаются путем вызова конструктора класса Task или Task<TResult>.Tasks executed by calling the RunSynchronously method are instantiated by calling a Task or Task<TResult> class constructor. Задача, запускаемая синхронно, должна находиться в состоянии Created.The task to be run synchronously must be in the Created state. Задача может быть запущена и запущена только один раз.A task may be started and run only once. Любые попытки запланировать задачу во второй раз приводят к исключению.Any attempts to schedule a task a second time results in an exception.

Если целевой планировщик не поддерживает выполнение этой задачи в текущем потоке, задача будет запланирована на выполнение планировщика, а текущий поток будет заблокирован до завершения выполнения задачи.If the target scheduler does not support running this task on the current thread, the task will be scheduled for execution on the scheduler, and the current thread will block until the task has completed execution. Поэтому вызывающему потоку не нужно вызывать метод, например Wait, чтобы убедиться, что выполнение задачи завершено.Because of this, the calling thread does not need to call a method such as Wait to ensure that the task has completed execution. Дополнительные сведения об обработке исключений для операций задач см. в разделе обработка исключений.For more information on exception handling for task operations, see Exception Handling.

Дополнительно

Применяется к