Task<TResult> 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
表示可以傳回值的異步操作。
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> 類別代表傳回值且通常會以異步方式執行的單一作業。 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
Next
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
在 .NET Framework 4 中啟動工作的替代方式和最常見的方法是呼叫靜態 TaskFactory.StartNew 或 TaskFactory<TResult>.StartNew 方法。
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
Next
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 主題中的一節。 請注意,市集應用程式會遵循 Windows 執行時間設定並取得預設文化特性。
對於未傳回值的作業,您可以使用 Task 類別。 從 C# 7.0 開始,若是實值型別而非參考型別的羽量型工作,請使用 System.Threading.Tasks.ValueTask<TResult> 結構。
建構函式
Task<TResult>(Func<Object,TResult>, Object) |
使用指定的函式和狀態,初始化新的 Task<TResult>。 |
Task<TResult>(Func<Object,TResult>, Object, CancellationToken) |
使用指定的動作、狀態和選項,初始化新的 Task<TResult>。 |
Task<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions) |
使用指定的動作、狀態和選項,初始化新的 Task<TResult>。 |
Task<TResult>(Func<Object,TResult>, Object, TaskCreationOptions) |
使用指定的動作、狀態和選項,初始化新的 Task<TResult>。 |
Task<TResult>(Func<TResult>) |
使用指定的函式初始化新的 Task<TResult>。 |
Task<TResult>(Func<TResult>, CancellationToken) |
使用指定的函式初始化新的 Task<TResult>。 |
Task<TResult>(Func<TResult>, CancellationToken, TaskCreationOptions) |
使用指定的函式和建立選項,初始化新的 Task<TResult>。 |
Task<TResult>(Func<TResult>, TaskCreationOptions) |
使用指定的函式和建立選項,初始化新的 Task<TResult>。 |
屬性
AsyncState |
取得建立 Task 時提供的狀態物件,如果沒有提供則為 null。 (繼承來源 Task) |
CreationOptions |
取得用來建立這項工作的 TaskCreationOptions。 (繼承來源 Task) |
Exception |
取得導致 Task 過早結束的 AggregateException。 如果 Task 順利完成或尚未擲回任何例外狀況,這會傳回 |
Factory |
取得用於建立和設定 Task<TResult> 實例的處理站方法。 |
Id |
取得這個 Task 實例的標識碼。 (繼承來源 Task) |
IsCanceled |
取得這個 Task 實例是否因為取消而完成執行。 (繼承來源 Task) |
IsCompleted |
取得值,這個值表示工作是否已完成。 (繼承來源 Task) |
IsCompletedSuccessfully |
取得工作是否執行完成。 (繼承來源 Task) |
IsFaulted |
取得 Task 是否因為未處理的例外狀況而完成。 (繼承來源 Task) |
Result |
取得這個 Task<TResult>的結果值。 |
Status |
取得此工作的 TaskStatus。 (繼承來源 Task) |
方法
明確介面實作
IAsyncResult.AsyncWaitHandle |
取得可用來等候工作完成的 WaitHandle。 (繼承來源 Task) |
IAsyncResult.CompletedSynchronously |
取得作業是否同步完成的指示。 (繼承來源 Task) |
擴充方法
適用於
執行緒安全性
除了 Dispose()之外,Task<TResult>的所有成員都是安全線程,而且可同時從多個線程使用。
另請參閱
- Task
- 工作平行連結庫 (TPL)
- 以工作為基礎的異步程序設計
- 使用 .NET Core 和 .NET Standard 進行平行程序設計
範例