Task.RunSynchronously メソッド

定義

現在の TaskTaskScheduler を同期的に実行します。

オーバーロード

RunSynchronously()

現在の TaskTaskScheduler を同期的に実行します。

RunSynchronously(TaskScheduler)

指定された TaskTaskScheduler を同期的に実行します。

RunSynchronously()

現在の TaskTaskScheduler を同期的に実行します。

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

例外

Task インスタンスは破棄されています。

Task は、開始する有効な状態にはありません。 既に開始、実行、またはキャンセルされたか、ダイレクト スケジューリングをサポートしない方法で作成された可能性があります。

次の例では、メソッドを呼び出 RunSynchronously して実行されるタスクと、非同期で実行されたタスクを比較します。 どちらの場合も、タスクはタスク ID とタスクが実行されているスレッドの ID を表示する同じラムダ式を実行します。 タスクは、1 ~ 1,000,000 の整数の合計を計算します。 この例の出力に示すように、メソッドを呼び出 RunSynchronously すことによって実行されるタスクはアプリケーション スレッドで実行されますが、非同期タスクは実行されません。

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

注釈

通常、タスクはスレッド プール スレッドで非同期的に実行され、呼び出し元のスレッドをブロックしません。 メソッドを呼び出 RunSynchronously() して実行されるタスクは、現在 TaskScheduler のタスクに関連付けられ、呼び出し元のスレッドで実行されます。 ターゲット スケジューラが呼び出し元のスレッドでこのタスクの実行をサポートしていない場合、タスクはスケジューラで実行するようにスケジュールされ、呼び出し元のスレッドはタスクの実行が完了するまでブロックされます。 タスクは同期的に実行されますが、呼び出し元のスレッドは、タスクがスローする可能性がある例外を処理するために引き続き呼び出 Wait す必要があります。 例外処理の詳細については、「 例外処理」を参照してください。

メソッドを呼び出RunSynchronouslyすことによって実行されるタスクは、コンストラクターまたはTask<TResult>クラス コンストラクターをTask呼び出すことによってインスタンス化されます。 同期的に実行するタスクは、状態である Created 必要があります。 タスクは 1 回だけ開始して実行できます。 タスクを 2 回目にスケジュールしようとすると、例外が発生します。

こちらもご覧ください

適用対象

RunSynchronously(TaskScheduler)

指定された TaskTaskScheduler を同期的に実行します。

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

このタスク インラインの実行を試みるスケジューラ。

例外

Task インスタンスは破棄されています。

scheduler 引数が null です。

Task は、開始する有効な状態にはありません。 既に開始、実行、またはキャンセルされたか、ダイレクト スケジューリングをサポートしない方法で作成された可能性があります。

注釈

メソッドを呼び出RunSynchronouslyすことによって実行されるタスクは、コンストラクターまたはTask<TResult>クラス コンストラクターをTask呼び出すことによってインスタンス化されます。 同期的に実行するタスクは、状態である Created 必要があります。 タスクは 1 回だけ開始して実行できます。 タスクを 2 回目にスケジュールしようとすると、例外が発生します。

ターゲット スケジューラが現在のスレッドでこのタスクの実行をサポートしていない場合、タスクはスケジューラで実行するようにスケジュールされ、現在のスレッドはタスクの実行が完了するまでブロックされます。 このため、呼び出し元のスレッドは、タスクが実行を完了したことを確認するなどの Wait メソッドを呼び出す必要はありません。 タスク操作の例外処理の詳細については、「 例外処理」を参照してください。

こちらもご覧ください

適用対象