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> 。
建構函式
| 名稱 | Description |
|---|---|
| Task<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions) |
初始化一個包含指定動作、狀態和選項的新物件 Task<TResult> 。 |
| Task<TResult>(Func<Object,TResult>, Object, CancellationToken) |
初始化一個包含指定動作、狀態和選項的新物件 Task<TResult> 。 |
| Task<TResult>(Func<Object,TResult>, Object, TaskCreationOptions) |
初始化一個包含指定動作、狀態和選項的新物件 Task<TResult> 。 |
| Task<TResult>(Func<Object,TResult>, Object) |
初始 Task<TResult> 化一個包含指定函數與狀態的新資料。 |
| Task<TResult>(Func<TResult>, CancellationToken, TaskCreationOptions) |
初始 Task<TResult> 化一個新的,使用指定的函式與建立選項。 |
| Task<TResult>(Func<TResult>, CancellationToken) |
初始化 Task<TResult> 一個新函式,並使用指定函式。 |
| Task<TResult>(Func<TResult>, TaskCreationOptions) |
初始 Task<TResult> 化一個新的,使用指定的函式與建立選項。 |
| Task<TResult>(Func<TResult>) |
初始化 Task<TResult> 一個新函式,並使用指定函式。 |
屬性
| 名稱 | Description |
|---|---|
| AsyncState |
取得建立時 Task 提供的狀態物件,若沒有提供則為 null。 (繼承來源 Task) |
| CreationOptions |
用 TaskCreationOptions 來完成這個任務。 (繼承來源 Task) |
| Exception |
這也說明 AggregateException 了導致他們 Task 提前結束的原因。 若 Task 成功完成或尚未拋出任何例外,則會返回 |
| Factory |
取得工廠方法來建立和設定 Task<TResult> 實例。 |
| Id |
這次會拿到ID Task 。 (繼承來源 Task) |
| IsCanceled |
會判斷這個 Task 實例是否因為被取消而完成執行。 (繼承來源 Task) |
| IsCompleted |
取得值,這個值表示工作是否已完成。 (繼承來源 Task) |
| IsCompletedSuccessfully |
取得工作是否執行完成。 (繼承來源 Task) |
| IsFaulted |
判斷是否 Task 因未處理的例外而完成。 (繼承來源 Task) |
| Result |
得到此 Task<TResult>值的結果值。 |
| Status |
明白 TaskStatus 這個任務。 (繼承來源 Task) |
方法
明確介面實作
| 名稱 | Description |
|---|---|
| IAsyncResult.AsyncWaitHandle |
獲得 WaitHandle 一個可以用來等待任務完成的選項。 (繼承來源 Task) |
| IAsyncResult.CompletedSynchronously |
取得作業是否同步完成的指示。 (繼承來源 Task) |
擴充方法
| 名稱 | Description |
|---|---|
| AsAsyncAction(Task) |
傳回代表已啟動工作的 Windows 運行時間異步動作。 |
| AsAsyncOperation<TResult>(Task<TResult>) |
會傳回 Windows 運行時間異步操作,代表傳回結果的已啟動工作。 |
| DispatcherOperationWait(Task, TimeSpan) |
等待標的 DispatcherOperation 資產完成指定時間。 |
| DispatcherOperationWait(Task) |
無限期等待底層 DispatcherOperation 完成。 |
| IsDispatcherOperationTask(Task) |
回傳一個值,表示此值 Task 是否與 DispatcherOperation相關聯。 |
適用於
執行緒安全性
除了 Dispose()之外,所有 的Task<TResult>成員都是執行緒安全的,且可同時從多個執行緒使用。
另請參閱
- Task
- 工作平行程式庫 (TPL)
- 以任務導向的異步程式設計
- .NET 平行程式設計範例