Task.RunSynchronously メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
現在の Task で TaskScheduler を同期的に実行します。
オーバーロード
RunSynchronously() |
現在の Task で TaskScheduler を同期的に実行します。 |
RunSynchronously(TaskScheduler) |
指定された Task で TaskScheduler を同期的に実行します。 |
RunSynchronously()
- ソース:
- Task.cs
- ソース:
- Task.cs
- ソース:
- Task.cs
現在の Task で TaskScheduler を同期的に実行します。
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
open System
open System.Threading
open System.Threading.Tasks
printfn $"Application executing on thread {Thread.CurrentThread.ManagedThreadId}"
let asyncTask =
Task.Run(fun () ->
printfn $"Task {Task.CurrentId} (asyncTask) executing on Thread {Thread.CurrentThread.ManagedThreadId}"
let mutable sum = 0L
for i = 1 to 1000000 do
sum <- sum + int64 i
sum)
let syncTask =
new Task<int64>(fun () ->
printfn $"Task {Task.CurrentId} (syncTask) executing on Thread {Thread.CurrentThread.ManagedThreadId}"
let mutable sum = 0L
for i = 1 to 1000000 do
sum <- sum + int64 i
sum)
syncTask.RunSynchronously()
printfn $"\nTask {syncTask.Id} returned {syncTask.Result:N0}"
printfn $"Task {asyncTask.Id} returned {asyncTask.Result:N0}"
// 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)
- ソース:
- Task.cs
- ソース:
- Task.cs
- ソース:
- Task.cs
指定された Task で TaskScheduler を同期的に実行します。
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 メソッドを呼び出して、タスクの実行が完了したことを確認する必要はありません。 タスク操作の例外処理の詳細については、「 例外処理」を参照してください。
こちらもご覧ください
適用対象
.NET