TaskFactory<TResult> 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
提供建立和排程 Task<TResult> 物件的支援。
generic <typename TResult>
public ref class TaskFactory
public class TaskFactory<TResult>
type TaskFactory<'Result> = class
Public Class TaskFactory(Of TResult)
類型參數
- TResult
此類別的方法所建立之 Task<TResult> 物件的傳回值。
- 繼承
-
TaskFactory<TResult>
範例
下列範例會使用靜態 Factory 屬性對 方法進行兩次 TaskFactory<TResult>.StartNew 呼叫。 第一個工作會傳回字串陣列,此陣列會填入使用者 MyDocuments 目錄中的檔案名,而第二個工作則會傳回字串陣列,該陣列會填入使用者 MyDocuments 目錄的子目錄名稱。 然後它會呼叫 TaskFactory.ContinueWhenAll(Task[], Action<Task[]>) 方法,在兩個工作完成執行之後,顯示兩個工作所傳回之陣列中檔案和目錄數目的相關資訊。
using System;
using System.IO;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Task<string[]>[] tasks = new Task<string[]>[2];
String docsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
tasks[0] = Task<string[]>.Factory.StartNew( () => Directory.GetFiles(docsDirectory));
tasks[1] = Task<string[]>.Factory.StartNew( () => Directory.GetDirectories(docsDirectory));
Task.Factory.ContinueWhenAll(tasks, completedTasks => {
Console.WriteLine("{0} contains: ", docsDirectory);
Console.WriteLine(" {0} subdirectories", tasks[1].Result.Length);
Console.WriteLine(" {0} files", tasks[0].Result.Length);
} );
}
}
// The example displays output like the following:
// C:\Users\<username>\Documents contains:
// 24 subdirectories
// 16 files
Imports System.IO
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim tasks(1) As Task(Of String())
Dim docsDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
tasks(0) = Task(Of String()).Factory.StartNew( Function()Directory.GetFiles(docsDirectory) )
'' End Sub )
tasks(1) = Task(Of String()).Factory.StartNew( Function() Directory.GetDirectories(docsDirectory) )
'' End Sub )
Task.Factory.ContinueWhenAll(tasks, Sub(completedTasks)
Console.WriteLine("{0} contains: ", docsDirectory)
Console.WriteLine(" {0} subdirectories", tasks(1).Result.Length)
Console.WriteLine(" {0} files", tasks(0).Result.Length)
End Sub)
End Sub
End Module
' The example displays output like the following:
' C:\Users\<username>\Documents contains:
' 24 subdirectories
' 16 files
備註
.NET 提供兩個處理站來建立和排程工作:
類別 TaskFactory ,其會 Task 建立 和 Task<TResult> 物件。
建立 TaskFactory<TResult> 物件的 類別 Task<TResult> 。
類別 TaskFactory<TResult> 可讓您執行下列動作:
建立工作,並藉由呼叫 StartNew 方法來立即啟動工作。 您可以呼叫這個方法的多載,以建立和執行需要非預設引數的工作。
警告
從 .NET Framework 4.5 開始, Task.Run 此方法提供最簡單的方式,以預設組態值建立工作,並立即啟動。
建立工作,此工作會呼叫 或 ContinueWhenAny 方法,在 ContinueWhenAny 陣列中的任何一個工作完成時啟動。
藉由呼叫 ContinueWhenAll 或 ContinueWhenAll 方法,建立陣列中所有工作完成時啟動的工作。
靜態 Task<TResult>.Factory 屬性會傳回預設 TaskFactory<TResult> 物件。 您也可以呼叫其中 TaskFactory<TResult> 一個類別建構函式,以設定 Task<TResult> 類別所建立的物件 TaskFactory<TResult> 。 下列範例會設定新的 TaskFactory<TResult> 物件,以建立具有指定解除標記、工作建立選項、接續選項和自訂工作排程器的工作。
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
static CancellationTokenSource cts = new CancellationTokenSource();
static TaskFactory<int> factory = new TaskFactory<int>(
cts.Token,
TaskCreationOptions.PreferFairness,
TaskContinuationOptions.ExecuteSynchronously,
new CustomScheduler());
static void Main()
{
var t2 = factory.StartNew(() => DoWork());
cts.Dispose();
}
static int DoWork()
{
/*...*/
return DateTime.Now.Hour <= 12 ? 1 : 2;
}
}
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim cts As New CancellationTokenSource()
Dim factory As New TaskFactory(Of Integer)(
cts.Token,
TaskCreationOptions.PreferFairness,
TaskContinuationOptions.ExecuteSynchronously,
New CustomScheduler())
Dim t2 = factory.StartNew(Function() DoWork())
cts.Dispose()
End Sub
Function DoWork() As Integer
Return If(Date.Now.Hour <= 12, 1, 2)
End Function
End Module
在大部分情況下,您不需要具現化新的 TaskFactory<TResult> 實例。 相反地,您可以使用靜態 Task<TResult>.Factory 屬性,它會傳回使用預設值的 Factory 物件。 然後,您可以呼叫其方法來啟動新工作或定義工作接續。 如需圖例,請參閱範例。
建構函式
TaskFactory<TResult>() |
使用預設組態,初始化 TaskFactory<TResult> 執行個體。 |
TaskFactory<TResult>(CancellationToken) |
使用預設組態,初始化 TaskFactory<TResult> 執行個體。 |
TaskFactory<TResult>(CancellationToken, TaskCreationOptions, TaskContinuationOptions, TaskScheduler) |
使用指定的組態,初始化 TaskFactory<TResult> 執行個體。 |
TaskFactory<TResult>(TaskCreationOptions, TaskContinuationOptions) |
使用指定的組態,初始化 TaskFactory<TResult> 執行個體。 |
TaskFactory<TResult>(TaskScheduler) |
使用指定的組態,初始化 TaskFactory<TResult> 執行個體。 |
屬性
CancellationToken |
取得這個工作 Factory 的預設取消語彙基元。 |
ContinuationOptions |
取得這個工作 Factory 的 TaskContinuationOptions 列舉值。 |
CreationOptions |
取得這個工作 Factory 的 TaskCreationOptions 列舉值。 |
Scheduler |
取得這個工作 Factory 的工作排程器。 |
方法
適用於
執行緒安全性
的所有公用和受保護成員 TaskFactory<TResult> 都是安全線程,而且可以從多個執行緒同時使用。