在 C# 中,Task.Run 和 Task.Factory.StartNew 这两个方法在使用上有哪些不同之处?
考察说明
考查对 C# 并行任务启动方式的理解,特别是默认配置与灵活性的差异。
回答思路
- 【回答框架 1】Task.Run 是启动后台任务的简便方法,它内部使用默认的任务调度器,并提供合理的默认参数,如取消令牌和任务创建选项。Task.Factory.StartNew 则提供了更多自定义选项,允许指定任务创建选项、调度器以及传递自定义状态等。
- 【回答框架 2】两者的主要区别在于默认行为:Task.Run 适用于大多数简单场景,它会自动处理异常并直接返回 Task。Task.Factory.StartNew 更灵活,但需要调用者自行处理很多细节,例如指定 TaskScheduler 或 TaskCreationOptions,否则可能引入意外行为。
- 【回答框架 3】Task.Run 是 Task.Factory.StartNew 的简化版,等价于使用 TaskCreationOptions.DenyChildAttach 和默认调度器的调用。对于需要较细粒度控制的场景,应使用 Task.Factory.StartNew。
- 【回答框架 4】在实际应用中,如果任务需要长时间运行或需要自定义调度策略,应选择 Task.Factory.StartNew;而普通异步操作使用 Task.Run 更安全简洁。
- 【关键点 1】Task.Run 提供更安全的默认参数,适用于大多数异步任务。
- 【关键点 2】Task.Factory.StartNew 允许自定义调度器和任务创建选项,但需谨慎使用。
- 【关键点 3】两者本质都是创建 Task,但默认行为不同,不应混用。
- 【易错点 1】误认为 Task.Run 和 Task.Factory.StartNew 完全等价,忽略默认参数差异。
- 【易错点 2】在不需要自定义时使用 Factory.StartNew,增加了代码复杂度。
- 【易错点 3】未考虑任务调度器选择可能导致的线程池饥饿问题。