TaskFactory<TResult> 类 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供对创建和计划 Task<TResult> 对象的支持。
generic <typename TResult>
public ref class TaskFactorypublic class TaskFactory<TResult>type TaskFactory<'Result> = classPublic 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 属性,该属性返回使用默认值的工厂对象。 然后,可以调用其方法来启动新任务或定义任务延续。 有关插图,请参阅示例。
构造函数
属性
| CancellationToken | 获取此任务工厂的默认取消标记。 | 
| ContinuationOptions | 获取此任务工厂的 TaskContinuationOptions 枚举值。 | 
| CreationOptions | 获取此任务工厂的 TaskCreationOptions 枚举值。 | 
| Scheduler | 获取此任务工厂的任务计划程序。 | 
方法
适用于
线程安全性
的所有公共成员和受保护成员 TaskFactory<TResult> 都是线程安全的,并且可以从多个线程并发使用。