Task.RunSynchronously メソッド

定義

現在の TaskTaskScheduler を同期的に実行します。Runs the Task synchronously on the current TaskScheduler.

オーバーロード

RunSynchronously()

現在の TaskTaskScheduler を同期的に実行します。Runs the Task synchronously on the current TaskScheduler.

RunSynchronously(TaskScheduler)

指定された TaskTaskScheduler を同期的に実行します。Runs the Task synchronously on the TaskScheduler provided.

RunSynchronously()

現在の TaskTaskScheduler を同期的に実行します。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 ~ 100万の整数の合計を計算します。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. @No__t-0 メソッドを呼び出すことによって実行されるタスクは、現在の 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.

@No__t-0 メソッドを呼び出すことによって実行されるタスクは、Task または Task<TResult> クラスコンストラクターを呼び出すことによってインスタンス化されます。Tasks executed by calling the RunSynchronously method are instantiated by calling a Task or Task<TResult> class constructor. 同期的に実行するタスクは、@no__t 0 の状態である必要があります。The task to be run synchronously must be in the Created state. タスクを開始して1回だけ実行することができます。A task may be started and run only once. タスクを2回目にスケジュールしようとすると、例外が発生します。Any attempts to schedule a task a second time results in an exception.

こちらもご覧ください

RunSynchronously(TaskScheduler)

指定された TaskTaskScheduler を同期的に実行します。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.

注釈

@No__t-0 メソッドを呼び出すことによって実行されるタスクは、Task または Task<TResult> クラスコンストラクターを呼び出すことによってインスタンス化されます。Tasks executed by calling the RunSynchronously method are instantiated by calling a Task or Task<TResult> class constructor. 同期的に実行するタスクは、@no__t 0 の状態である必要があります。The task to be run synchronously must be in the Created state. タスクを開始して1回だけ実行することができます。A task may be started and run only once. タスクを2回目にスケジュールしようとすると、例外が発生します。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.

こちらもご覧ください

適用対象