TaskFactory<TResult> 類別

定義

提供建立和排程 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<TResult> 可讓您執行下列動作:

  • 建立工作,並藉由呼叫 StartNew 方法來立即啟動工作。 您可以呼叫這個方法的多載,以建立和執行需要非預設引數的工作。

    警告

    從 .NET Framework 4.5 開始, Task.Run 此方法提供最簡單的方式,以預設組態值建立工作,並立即啟動。

  • 建立工作,此工作會呼叫 或 ContinueWhenAny 方法,在 ContinueWhenAny 陣列中的任何一個工作完成時啟動。

  • 藉由呼叫 ContinueWhenAllContinueWhenAll 方法,建立陣列中所有工作完成時啟動的工作。

靜態 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 的工作排程器。

方法

ContinueWhenAll(Task[], Func<Task[],TResult>)

建立會在提供的一組工作完成時啟動的接續工作。

ContinueWhenAll(Task[], Func<Task[],TResult>, CancellationToken)

建立會在提供的一組工作完成時啟動的接續工作。

ContinueWhenAll(Task[], Func<Task[],TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

建立會在提供的一組工作完成時啟動的接續工作。

ContinueWhenAll(Task[], Func<Task[],TResult>, TaskContinuationOptions)

建立會在提供的一組工作完成時啟動的接續工作。

ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>)

建立會在提供的一組工作完成時啟動的接續工作。

ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken)

建立會在提供的一組工作完成時啟動的接續工作。

ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

建立會在提供的一組工作完成時啟動的接續工作。

ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, TaskContinuationOptions)

建立會在提供的一組工作完成時啟動的接續工作。

ContinueWhenAny(Task[], Func<Task,TResult>)

建立會在提供的任何一項工作完成時啟動的接續工作。

ContinueWhenAny(Task[], Func<Task,TResult>, CancellationToken)

建立會在提供的任何一項工作完成時啟動的接續工作。

ContinueWhenAny(Task[], Func<Task,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

建立會在提供的任何一項工作完成時啟動的接續工作。

ContinueWhenAny(Task[], Func<Task,TResult>, TaskContinuationOptions)

建立會在提供的任何一項工作完成時啟動的接續工作。

ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>,TResult>)

建立會在提供的任何一項工作完成時啟動的接續工作。

ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>,TResult>, CancellationToken)

建立會在提供的任何一項工作完成時啟動的接續工作。

ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

建立會在提供的任何一項工作完成時啟動的接續工作。

ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>,TResult>, TaskContinuationOptions)

建立會在提供的任何一項工作完成時啟動的接續工作。

Equals(Object)

判斷指定的物件是否等於目前的物件。

(繼承來源 Object)
FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, Object)

建立工作,這個項目代表一組符合「非同步程式設計模型」模式的開始和結束方法。

FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, Object, TaskCreationOptions)

建立工作,這個項目代表一組符合「非同步程式設計模型」模式的開始和結束方法。

FromAsync(IAsyncResult, Func<IAsyncResult,TResult>)

建立工作,當指定的 IAsyncResult 完成時會執行結束方法函式。

FromAsync(IAsyncResult, Func<IAsyncResult,TResult>, TaskCreationOptions)

建立工作,當指定的 IAsyncResult 完成時會執行結束方法函式。

FromAsync(IAsyncResult, Func<IAsyncResult,TResult>, TaskCreationOptions, TaskScheduler)

建立工作,當指定的 IAsyncResult 完成時會執行結束方法函式。

FromAsync<TArg1,TArg2,TArg3>(Func<TArg1,TArg2,TArg3,AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, TArg2, TArg3, Object)

建立工作,這個項目代表一組符合「非同步程式設計模型」模式的開始和結束方法。

FromAsync<TArg1,TArg2,TArg3>(Func<TArg1,TArg2,TArg3,AsyncCallback, Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, TArg2, TArg3, Object, TaskCreationOptions)

建立工作,這個項目代表一組符合「非同步程式設計模型」模式的開始和結束方法。

FromAsync<TArg1,TArg2>(Func<TArg1,TArg2,AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, TArg2, Object)

建立工作,這個項目代表一組符合「非同步程式設計模型」模式的開始和結束方法。

FromAsync<TArg1,TArg2>(Func<TArg1,TArg2,AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, TArg2, Object, TaskCreationOptions)

建立工作,這個項目代表一組符合「非同步程式設計模型」模式的開始和結束方法。

FromAsync<TArg1>(Func<TArg1,AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, Object)

建立工作,這個項目代表一組符合「非同步程式設計模型」模式的開始和結束方法。

FromAsync<TArg1>(Func<TArg1,AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, Object, TaskCreationOptions)

建立工作,這個項目代表一組符合「非同步程式設計模型」模式的開始和結束方法。

GetHashCode()

做為預設雜湊函式。

(繼承來源 Object)
GetType()

取得目前執行個體的 Type

(繼承來源 Object)
MemberwiseClone()

建立目前 Object 的淺層複製。

(繼承來源 Object)
StartNew(Func<Object,TResult>, Object)

建立並啟動工作。

StartNew(Func<Object,TResult>, Object, CancellationToken)

建立並啟動工作。

StartNew(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions, TaskScheduler)

建立並啟動工作。

StartNew(Func<Object,TResult>, Object, TaskCreationOptions)

建立並啟動工作。

StartNew(Func<TResult>)

建立並啟動工作。

StartNew(Func<TResult>, CancellationToken)

建立並啟動工作。

StartNew(Func<TResult>, CancellationToken, TaskCreationOptions, TaskScheduler)

建立並啟動工作。

StartNew(Func<TResult>, TaskCreationOptions)

建立並啟動工作。

ToString()

傳回代表目前物件的字串。

(繼承來源 Object)

適用於

執行緒安全性

的所有公用和受保護成員 TaskFactory<TResult> 都是安全線程,而且可以從多個執行緒同時使用。

另請參閱