c#中Task.Run 和使用 Task 构造函数创建任务的区别

Task.Run 和使用 Task 构造函数创建任务是两种不同的方法,它们在某些方面有显著的区别:

  1. 启动方式:

    • Task.Run 是一个静态方法,它立即启动一个任务并在后台执行指定的工作。它通常用于快速启动一个简单的后台任务。
    • 使用 Task 构造函数创建任务,你需要手动启动任务,通常是通过调用 .Start() 方法或使用 await 关键字。
  2. 任务启动的线程:

    • Task.Run 总是使用 TaskScheduler 的默认值来启动任务,这通常是 ThreadPool,它负责在线程池的线程上执行任务。
    • 当使用 Task 构造函数时,你可以指定一个 TaskScheduler,如果你不指定,它也会使用默认的 TaskScheduler
  3. 任务的状态管理:

    • Task.Run 会立即启动任务,并且不提供对任务状态的直接控制。
    • 使用 Task 构造函数创建的任务,你可以在调用 .Start() 之前设置任务的各种属性,例如 CancellationToken
  4. 任务的返回值:

    • Task.Run 可以用于没有返回值的 Action 委托,也可以用于有返回值的 Func<TResult> 委托。
    • 使用 Task<TResult> 构造函数创建的任务,你需要指定返回值的类型,并且可以通过 .Result 属性或 await 获取返回值。
  5. 任务的取消:

    • Task.Run 允许你传递一个 CancellationToken 来支持任务的取消。
    • 使用 Task 构造函数创建的任务,同样可以传递 CancellationToken,并在任务执行过程中检查取消请求。
  6. 任务的异常处理:

    • Task.Run 启动的任务如果在执行过程中抛出异常,这个异常会被封装在 AggregateException 中,并且可以通过 Task 对象的 Exception 属性访问。
    • 使用 Task 构造函数创建的任务,异常处理方式与 Task.Run 相同。
  7. 使用场景:

    • Task.Run 适合快速启动简单的后台任务,特别是当你不需要对任务进行复杂的配置或管理时。
    • 使用 Task 构造函数创建的任务,适合需要更多控制的场景,例如需要设置特定的 TaskScheduler,或者需要在任务启动之前进行一些准备工作。
cs 复制代码
// 使用 Task 构造函数创建任务
var task = new Task(() => SomeMethodThatDoesWork());
task.Start(); // 手动启动任务

// 或者使用异步 Lambda 表达式
var taskWithResult = new Task<int>(() => SomeMethodThatReturnsInt());
taskWithResult.Start();
int result = taskWithResult.Result; // 注意:这将阻塞当前线程

如果你需要快速启动一个简单的后台任务,Task.Run 是一个很好的选择。如果你需要更多的控制,例如设置 CancellationToken 或自定义 TaskScheduler,那么使用 Task 构造函数可能更合适。

相关推荐
忧郁的蛋~1 小时前
.NET实现多任务异步与并行处理的详细步骤
后端·c#·asp.net·.net·.netcore
阿登林1 小时前
C# iText7与iTextSharp导出PDF对比
开发语言·pdf·c#
虚行3 小时前
WPF入门
开发语言·c#·wpf
djk88884 小时前
一个完整的 TCP 服务器监听示例(C#)
服务器·tcp/ip·c#
虚行6 小时前
C#技术栈
开发语言·c#
唐青枫7 小时前
C#.NET SqlKata 使用详解:优雅构建动态 SQL 查询
c#·.net
虚行15 小时前
C#上位机工程师技能清单文档
开发语言·c#
小白杨树树18 小时前
【C++】力扣hot100错误总结
c++·leetcode·c#
Tiger_shl18 小时前
三大并发集合ConcurrentDictionary、ConcurrentBag、ConcurrentQueue
开发语言·c#
时光追逐者20 小时前
一个使用 WPF 开发的 Diagram 画板工具(包含流程图FlowChart,思维导图MindEditor)
c#·.net·wpf·流程图