在C#的异步编程体系里,Task是承载异步操作和多线程任务的核心类型,当我们通过Task构造函数或者TaskFactory创建任务时,可以传入TaskCreationOptions枚举来配置任务的运行特性,这个枚举会影响任务的调度方式、生命周期管理以及和其他任务的关联关系。

TaskCreationOptions 枚举的常见成员
TaskCreationOptions是System.Threading.Tasks命名空间下的枚举,常见的成员及含义如下:
- None:默认选项,不指定任何特殊行为,任务按照默认的调度规则执行。
- PreferFairness:提示任务调度器尽量公平地调度任务,避免先创建的任务一直占用资源,让等待时间更久的任务有机会先执行。
- LongRunning:标记当前任务是长时间运行的,调度器会为该任务分配独立的线程,而不是从线程池获取线程,避免占用线程池的有限资源。
- AttachedToParent:将当前任务附加到父任务上,父任务会等待所有附加的子任务完成后才会进入完成状态。
- DenyChildAttach:禁止其他任务作为子任务附加到当前任务上,即使子任务指定了AttachedToParent选项也会失效。
- HideScheduler:隐藏当前任务的调度器,子任务会使用默认调度器而不是父任务的调度器。
核心用途场景说明
1. 优化长时间运行任务
如果任务是长时间运行的,比如需要执行几秒甚至更久的操作,使用LongRunning选项可以避免占用线程池的工作线程,防止线程池资源耗尽。以下是使用示例:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
// 创建长时间运行的任务
Task longTask = new Task(() =>
{
Console.WriteLine("长时间任务开始执行");
Thread.Sleep(3000); // 模拟长时间操作
Console.WriteLine("长时间任务执行完成");
}, TaskCreationOptions.LongRunning);
longTask.Start();
longTask.Wait();
Console.WriteLine("主线程继续执行");
}
}
2. 管理父子任务关联
当我们需要一组子任务全部完成后,父任务才能结束的场景,可以使用AttachedToParent选项。父任务会等待所有附加的子任务完成后再进入完成状态:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Task parentTask = new Task(() =>
{
Console.WriteLine("父任务开始执行");
// 创建附加到父任务的子任务
Task childTask1 = new Task(() =>
{
Thread.Sleep(1000);
Console.WriteLine("子任务1执行完成");
}, TaskCreationOptions.AttachedToParent);
Task childTask2 = new Task(() =>
{
Thread.Sleep(1500);
Console.WriteLine("子任务2执行完成");
}, TaskCreationOptions.AttachedToParent);
childTask1.Start();
childTask2.Start();
Console.WriteLine("父任务内部逻辑执行完成");
});
parentTask.Start();
parentTask.Wait();
Console.WriteLine("父任务所有子任务完成后,主线程才执行到这里");
}
}
3. 控制任务调度公平性
当有多个任务并发执行,希望调度器尽量公平分配执行机会时,可以指定PreferFairness选项,不过这只是调度器的提示,不保证绝对公平:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
for (int i = 0; i < 5; i++)
{
int taskId = i;
Task task = new Task(() =>
{
Console.WriteLine($"公平调度任务{taskId}开始执行");
Thread.Sleep(500);
}, TaskCreationOptions.PreferFairness);
task.Start();
}
Thread.Sleep(2000);
Console.WriteLine("所有公平调度任务执行完成");
}
}
使用注意事项
首先,TaskCreationOptions的选项可以组合使用,比如同时指定LongRunning和AttachedToParent,只需要用按位或运算符连接即可:
Task task = new Task(() => { }, TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
其次,LongRunning选项虽然适合长时间任务,但也不要滥用,因为独立线程的创建和销毁成本比线程池线程更高,如果是短时间任务还是使用默认选项更合适。
最后,AttachedToParent选项只对新创建的任务生效,已经运行的任务无法再附加到父任务上,同时如果父任务被取消,所有附加的子任务也会被取消。
TaskCreationOptionsC#_Task异步编程多线程修改时间:2026-07-09 20:39:25