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. 두 경우 모두 작업이 실행 작업 ID 및 스레드 ID를 표시 하는 동일한 람다 식이 실행 되는 작업.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. 작업이 동기적으로 실행 되는 경우에도 호출 스레드는 작업에서 throw 할 수 있는 예외를 처리 하기 위해 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.

추가 정보

적용 대상