C#中TaskFactory实现线程任务
在 C# 中TaskFactory是System.Threading.Tasks命名空间下的一个类它为任务的创建、管理和调度提供了一个简便的方式。与直接使用Task类相比TaskFactory提供了更高层次的抽象允许开发者更加灵活地控制任务的创建、执行、取消、调度等操作。1.TaskFactory的基本概念TaskFactory是一个帮助你创建和管理任务的工具类。它通过封装Task的创建过程使得任务的启动、调度和继续等操作变得更加方便和灵活。主要功能和用途任务创建和启动通过StartNew方法创建并启动新的任务。任务调度控制允许通过指定TaskCreationOptions和TaskContinuationOptions来控制任务的行为。任务的链式操作支持在一个任务完成后自动执行其他任务。支持取消任务可以结合CancellationToken来控制任务的取消。处理异常能够在任务异常时进行处理。2.TaskFactory的基本功能任务创建与启动 (StartNew)TaskFactory提供了StartNew方法来创建并启动任务。这是其最常用的功能它允许你异步执行一个委托通常是一个Action或Func。1234var factory newTaskFactory();Task task factory.StartNew(() {Console.WriteLine(任务开始执行...);});在这个例子中StartNew会启动一个新任务并异步执行提供的委托。任务选项控制TaskCreationOptionsTaskFactory允许你通过TaskCreationOptions来定制任务的创建方式。你可以指定任务的执行方式、优先级等。常见的选项包括None默认选项任务使用线程池线程执行。LongRunning表示任务可能需要长时间执行通常会分配一个新的线程来执行任务而不是使用线程池。AttachedToParent指示任务是父任务的一部分。DenyChildAttach阻止子任务附加到父任务。1234var factory newTaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);Task task factory.StartNew(() {Console.WriteLine(长时间运行的任务);});任务链式操作ContinueWith和TaskContinuationOptionsTaskFactory允许你创建任务的链式操作也就是一个任务完成后可以自动执行另一个任务。你可以使用ContinueWith来设置后续任务并通过TaskContinuationOptions控制后续任务的执行条件。例如你可以让任务只在当前任务成功完成时执行后续任务或者只在任务失败时执行后续任务。1234567Task task1 factory.StartNew(() {Console.WriteLine(任务1);});Task task2 task1.ContinueWith(t {Console.WriteLine(任务2在任务1完成后执行);}, TaskContinuationOptions.OnlyOnRanToCompletion);任务取消CancellationTokenTaskFactory可以与CancellationToken配合使用以便支持任务取消。当你需要取消一个任务时CancellationTokenSource发出取消请求Task会检查该请求并在合适的时机停止执行。123456789101112131415var cts newCancellationTokenSource();var factory newTaskFactory();Task task factory.StartNew(() {for(inti 0; i 10; i) {if(cts.Token.IsCancellationRequested) {Console.WriteLine(任务已取消);return;}Console.WriteLine(任务正在执行...);Thread.Sleep(1000);}}, cts.Token);// 取消任务cts.Cancel();任务异常处理TaskFactory还支持任务的异常处理。如果任务在执行过程中发生异常你可以通过ContinueWith捕获并处理这些异常。1234567Task task factory.StartNew(() {thrownewInvalidOperationException(发生错误);}).ContinueWith(t {if(t.Exception !null) {Console.WriteLine($任务发生了异常: {t.Exception.Message});}}, TaskContinuationOptions.OnlyOnFaulted);在这个例子中ContinueWith会在任务发生异常时被调用并处理异常信息。3.TaskFactory的实现原理与机制TaskFactory本质上是对Task类的封装它通过TaskCreationOptions和TaskContinuationOptions提供了更灵活的任务调度和管理方式。内部工作机制任务创建和启动TaskFactory提供的方法如StartNew会创建一个Task实例并将任务的执行逻辑传递给Task。任务调度TaskFactory可以通过不同的任务选项来控制任务的调度方式例如将任务标记为长时间运行的任务。任务链式操作ContinueWith和TaskContinuationOptions使得开发者能够创建任务之间的依赖关系并定义任务完成后的后续动作。任务取消任务的取消是通过CancellationToken实现的。开发者可以通过传递CancellationToken来允许任务在某个条件下提前终止。4. 主要的使用场景场景 1并行任务的启动TaskFactory用于启动多个并行执行的任务特别是在需要对任务进行细粒度控制时。例如在处理多个独立的任务时你可能会使用TaskFactory来启动这些任务并通过Task.WhenAll等方法等待所有任务完成。123456789Task task1 factory.StartNew(() {// 执行任务1});Task task2 factory.StartNew(() {// 执行任务2});Task.WhenAll(task1, task2).ContinueWith(t {Console.WriteLine(所有任务完成);});场景 2长时间运行的任务使用TaskCreationOptions.LongRunning来创建需要长时间执行的任务。通常这些任务不应使用线程池线程来执行而应该单独分配线程以避免阻塞线程池中的其他任务。1234var factory newTaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);Task task factory.StartNew(() {// 执行长时间任务});场景 3任务的依赖关系当任务之间有依赖关系时TaskFactory的ContinueWith方法非常有用。你可以指定某个任务成功完成后执行另一个任务或者在任务失败时执行相应的操作。123456Task task1 factory.StartNew(() {// 任务1的操作});Task task2 task1.ContinueWith(t {// 任务2的操作}, TaskContinuationOptions.OnlyOnRanToCompletion);场景 4任务取消TaskFactory还适用于需要支持取消操作的任务。例如在下载文件、处理大批数据等场景中你可以使用CancellationToken来取消正在执行的任务。