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 小时前
计算机(电脑)是什么?零基础硬件软件详解
java·开发语言·算法·c#·电脑·集合
R-G-B1 小时前
【14】大恒相机SDK C#开发 ——Bitmap.UnlockBits()什么意思?有什么用?bmpData.Scan0;什么意思?有什么用?
c#·bitmap·大恒相机c#开发·unlockbits·bmpdata.scan0·bmpdata
R-G-B3 小时前
【05】大恒相机SDK C#开发 —— Winform中采集图像并显示
开发语言·c#·大恒相机sdk·winform中采集图像·winform中采集图像并显示
R-G-B8 小时前
【05】OpenCV C#——OpenCvSharp 图像基本操作---转灰度图、边缘提取、兴趣区域ROI,图像叠加
opencv·c#·opencvsharp边缘提取·cvsharp图像基本操作·cvsharp感兴趣区域roi·opencvsharp图像叠加
鹿野素材屋13 小时前
C#中对于List的多种排序方式
开发语言·c#
一个人的博客@你17 小时前
C#多数据库批量执行脚本工具
数据库·c#·批量执行·sql脚本·多数据库执行
程序猿不脱发220 小时前
【MQ】kafka同步和异步的区别
c#·linq
向宇it1 天前
【unity实战】简易的车辆控制系统
游戏·unity·c#·游戏引擎
R-G-B1 天前
【01】OpenCV C#——C#开发环境OpenCvSharp 环境配置 工程搭建 及代码测试
opencv·c#·opencvsharp·opencvsharp环境搭建·opencvsharp开发环境·opencv c#·opencvsharp代码测试
三千道应用题1 天前
WPF&C#超市管理系统(4)入库管理
c#·wpf