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 方法以異步方式執行的工作。 在這兩種情況下,工作都會執行相同的 Lambda 運算式,以顯示工作執行所在線程的工作標識碼和標識符。 工作會計算介於 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 或 Task<TResult> 類別建構函式來具現化。 要同步執行的工作必須處於 Created 狀態。 工作只能啟動並執行一次。 第二次排程工作的任何嘗試都會導致例外狀況。
另請參閱
適用於
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 或 Task<TResult> 類別建構函式來具現化。 要同步執行的工作必須處於 Created 狀態。 工作只能啟動並執行一次。 第二次排程工作的任何嘗試都會導致例外狀況。
如果目標排程器不支援在目前線程上執行這項工作,工作將會排程在排程器上執行,而目前的線程將會封鎖,直到工作完成執行為止。 因此,呼叫線程不需要呼叫 之類的 Wait 方法,以確保工作已完成執行。 如需工作作業例外狀況處理的詳細資訊,請參閱 例外狀況處理。