Task.RunSynchronously 方法

定義

以電流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 個方法來確保任務已完成執行。 欲了解更多關於任務操作例外處理的資訊,請參見 例外處理

另請參閱

適用於