generic <typename TResult>
public ref class Task : System::Threading::Tasks::Task
public class Task<TResult> : System.Threading.Tasks.Task
type Task<'Result> = class
inherit Task
Public Class Task(Of TResult)
Inherits Task
TResult
類別
Task<TResult>
代表傳回值且通常以非同步方式執行的單一作業。
Task<TResult>
物件是工作
型非同步模式
的其中一個中央元件,先在.NET Framework 4 中引進。 由於 物件所
Task<TResult>
執行的工作通常會以非同步方式線上程集區執行緒上執行,而不是在主要應用程式執行緒上同步執行,因此您可以使用
Status
屬性
IsCanceled
以及 、
IsCompleted
和
IsFaulted
屬性來判斷工作的狀態。 最常使用 Lambda 運算式來指定工作要執行的工作。
Task<TResult>
實例可以透過各種方式建立。 從 .NET Framework 4.5 開始,最常見的方法是呼叫靜態
Task.Run<TResult>(Func<TResult>)
或
Task.Run<TResult>(Func<TResult>, CancellationToken)
方法。 這些方法提供簡單的方法來使用預設值來啟動工作,而不需取得其他參數。 下列範例會
Task.Run<TResult>(Func<TResult>)
使用 方法來啟動迴圈的工作,然後顯示迴圈反復專案的數目:
using System;
using System.Threading.Tasks;
public class Example
public static void Main()
var t = Task<int>.Run( () => {
// Just loop.
int max = 1000000;
int ctr = 0;
for (ctr = 0; ctr <= max; ctr++) {
if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
ctr++;
break;
return ctr;
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
// The example displays output like the following:
// Finished 1,000,001 loop iterations.
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim t As Task(Of Integer) = Task.Run(Function()
Dim max As Integer = 1000000
Dim ctr As Integer
For ctr = 0 to max
If ctr = max \ 2 And Date.Now.Hour <= 12 Then
ctr += 1
Exit For
End If
Return ctr
End Function)
Console.WriteLine("Finished {0:N0} iterations.", t.Result)
End Sub
End Module
' The example displays the following output:
' Finished 1,000,001 loop iterations
另一個方法是呼叫靜態
TaskFactory.StartNew
或
TaskFactory<TResult>.StartNew
方法,以及在 .NET Framework 4 中啟動工作的最常見方式。 屬性
Task.Factory
會傳
TaskFactory
回 物件,而
Task<TResult>.Factory
屬性會傳
TaskFactory<TResult>
回 物件。 其
StartNew
方法的多載可讓您傳遞引數、定義工作建立選項,以及指定工作排程器。 下列範例會
TaskFactory<TResult>.StartNew(Func<TResult>)
使用 方法來啟動工作。 它的功能相當於上一個範例中的程式碼。
using System;
using System.Threading.Tasks;
public class Example
public static void Main()
var t = Task<int>.Factory.StartNew( () => {
// Just loop.
int max = 1000000;
int ctr = 0;
for (ctr = 0; ctr <= max; ctr++) {
if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
ctr++;
break;
return ctr;
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
// The example displays the following output:
// Finished 1000001 loop iterations
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim t = Task(Of Integer).Factory.StartNew(Function()
Dim max As Integer = 1000000
Dim ctr As Integer
For ctr = 0 to max
If ctr = max \ 2 And Date.Now.Hour <= 12 Then
ctr += 1
Exit For
End If
Return ctr
End Function)
Console.WriteLine("Finished {0:N0} iterations.", t.Result)
End Sub
End Module
' The example displays output like the following:
' Finished 1,000,001 iterations
如需更完整的範例,請參閱
以工作為基礎的非同步程式設計
。
類別
Task<TResult>
也提供初始化工作的建構函式,但不會排程執行工作。 基於效能考慮,
Task.Run
和
Task.Factory.StartNew
方法是建立和排程計算工作的慣用機制,但對於必須分隔工作建立和排程的案例,可以使用建構函式,然後
Start
工作的方法可用來排程工作以供稍後執行。
從以 .NET Framework 4.6 為目標的桌面應用程式開始,建立和叫用工作的執行緒文化特性會成為執行緒內容的一部分。 也就是說,不論工作執行所在的執行緒目前文化特性為何,工作目前的文化特性都是呼叫執行緒的文化特性。 對於以 .NET Framework 4.6 之前.NET Framework版本為目標的應用程式,工作的文化特性是工作執行所線上程的文化特性。 如需詳細資訊,請參閱主題中的
CultureInfo
一節。 請注意,Microsoft Store應用程式遵循設定和取得預設文化特性中的Windows 執行階段。
對於未傳回值的作業,您可以使用
Task
類別。 從 C# 7.0 開始,對於實數值型別而非參考類型的輕量型工作,請使用
System.Threading.Tasks.ValueTask<TResult>
結構。