TaskFactory 类 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供对创建和计划 Task 对象的支持。
public ref class TaskFactorypublic class TaskFactorytype TaskFactory = classPublic Class TaskFactory- 继承
- 
				TaskFactory
示例
以下示例使用静态 Factory 属性对该方法进行两次调用 TaskFactory.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[] tasks = new Task[2];
      String[] files = null;
      String[] dirs = null;
      String docsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
      tasks[0] = Task.Factory.StartNew( () => files = Directory.GetFiles(docsDirectory));
      tasks[1] = Task.Factory.StartNew( () => dirs = Directory.GetDirectories(docsDirectory));
      Task.Factory.ContinueWhenAll(tasks, completedTasks => {
                                             Console.WriteLine("{0} contains: ", docsDirectory);
                                             Console.WriteLine("   {0} subdirectories", dirs.Length);
                                             Console.WriteLine("   {0} files", files.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
      Dim files() As String = Nothing
      Dim dirs() As String = Nothing
      Dim docsDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
      
      tasks(0) = Task.Factory.StartNew( Sub()
                                           files = Directory.GetFiles(docsDirectory)
                                        End Sub )
      tasks(1) = Task.Factory.StartNew( Sub()
                                           dirs = Directory.GetDirectories(docsDirectory)
                                        End Sub )
      Task.Factory.ContinueWhenAll(tasks, Sub(completedTasks)
                                             Console.WriteLine("{0} contains: ", docsDirectory)
                                             Console.WriteLine("   {0} subdirectories", dirs.Length)
                                             Console.WriteLine("   {0} files", files.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<TResult>对象的类Task。 可以调用此方法的重载来创建和执行需要非默认参数的任务。 - 警告 - 从 .NET Framework 4.5 开始,该方法Task.Run提供了创建具有默认配置值的任务的最简单方法,并立即启动它。 
- 用于 TaskFactory<TResult> 创建 Task<TResult> 对象的类。 
类 TaskFactory 允许执行以下操作:
- 创建一个任务,并通过调用 StartNew 该方法立即启动它。 - 警告 - 从 .NET Framework 4.5 开始,该方法Task.Run提供了创建具有默认配置值的任务的最简单方法,并立即启动它。 
- 创建一个任务,该任务在数组中的任何一个任务通过调用 ContinueWhenAny 方法完成时启动。 
- 创建一个任务,该任务在数组中的所有任务都通过调用 ContinueWhenAll 该方法完成时启动。 
静态 Task<TResult>.Factory 属性返回默认 TaskFactory<TResult> 对象。 还可以调用其中一个 TaskFactory 类构造函数来配置 Task 类创建的对象 TaskFactory 。 以下示例配置一个新 TaskFactory 对象以创建具有指定取消标记、任务创建选项、延续选项和自定义任务计划程序的任务。
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
class Example
{
   static CancellationTokenSource cts = new CancellationTokenSource();
   static TaskFactory factory = new TaskFactory(
      cts.Token,
      TaskCreationOptions.PreferFairness,
      TaskContinuationOptions.ExecuteSynchronously,
      new CustomScheduler());
   static void Main()
   {
      var t2 = factory.StartNew(() => DoWork());
      cts.Dispose();
   }
   static void DoWork() {/*...*/ }
}
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(cts.Token,
                                     TaskCreationOptions.PreferFairness,
                                     TaskContinuationOptions.ExecuteSynchronously,
                                     New CustomScheduler())
      Dim t2 = factory.StartNew(Sub() DoWork())
      cts.Dispose()
   End Sub
   Sub DoWork()
      ' ...
   End Sub
End Module
在大多数情况下,无需实例化新 TaskFactory 实例。 相反,可以使用该 Task.Factory 属性,该属性返回使用默认值的工厂对象。 然后,可以调用其方法来启动新任务或定义任务延续。 有关插图,请参阅示例。
构造函数
| TaskFactory() | 使用默认配置初始化 TaskFactory 实例。 | 
| TaskFactory(CancellationToken) | 使用指定配置初始化 TaskFactory 实例。 | 
| TaskFactory(CancellationToken, TaskCreationOptions, TaskContinuationOptions, TaskScheduler) | 使用指定配置初始化 TaskFactory 实例。 | 
| TaskFactory(TaskCreationOptions, TaskContinuationOptions) | 使用指定配置初始化 TaskFactory 实例。 | 
| TaskFactory(TaskScheduler) | 使用指定配置初始化 TaskFactory 实例。 | 
属性
| CancellationToken | 获取此任务工厂的默认取消标记。 | 
| ContinuationOptions | 获取此任务工厂的默认任务继续选项。 | 
| CreationOptions | 获取此任务工厂的默认任务创建选项。 | 
| Scheduler | 获取此任务工厂的默认任务计划程序。 | 
方法
适用于
线程安全性
所有公共成员和受保护的成员 TaskFactory 都是线程安全的,可以同时从多个线程使用。