Task.RunSynchronously 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
以電流Task同步運行。TaskScheduler
多載
| 名稱 | Description |
|---|---|
| RunSynchronously() |
以電流Task同步運行。TaskScheduler |
| RunSynchronously(TaskScheduler) |
在提供的系統上同步運行TaskTaskScheduler。 |
RunSynchronously()
以電流Task同步運行。TaskScheduler
public:
void RunSynchronously();
public void RunSynchronously();
member this.RunSynchronously : unit -> unit
Public Sub RunSynchronously ()
例外狀況
Task該實例已被處理。
目前 Task 的狀態無法啟動。 它可能已經被啟動、執行或取消,或者是以不支援直接排程的方式建立。
範例
以下範例比較了呼叫該 RunSynchronously 方法執行的任務與非同步執行的任務。 在這兩種情況下,任務執行相同的 lambda 表達式,顯示任務 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 OR Task<TResult> 類別建構子來實例化。 要同步執行的任務必須處於 狀態 Created 。 任務只能啟動並執行一次。 任何第二次排程任務的嘗試都會產生例外。
另請參閱
適用於
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 OR Task<TResult> 類別建構子來實例化。 要同步執行的任務必須處於 狀態 Created 。 任務只能啟動並執行一次。 任何第二次排程任務的嘗試都會產生例外。
若目標排程器不支援在當前執行緒上執行此任務,該任務將排程執行,並阻塞直到任務完成執行。 因此,呼叫執行緒不需要呼叫某 Wait 個方法來確保任務已完成執行。 欲了解更多關於任務操作例外處理的資訊,請參見 例外處理。