0

0

c# Task.Run 中的 Action 和 Func 有什么区别

月夜之吻

月夜之吻

发布时间:2026-01-13 12:05:02

|

451人浏览过

|

来源于php中文网

原创

应优先使用Action,仅在需卸载CPU密集型同步计算时用Task.Run;传Func极易导致悬空任务、未观察异常或意外同步执行,正确做法是直接await原async方法。

c# task.run 中的 action 和 func<task> 有什么<a   style=区别">

Task.Run 里传 ActionFunc 的行为完全不同

Action 是让线程池执行一个「不返回任务的普通方法」,而传 Func 是让线程池执行一个「返回未启动任务的工厂函数」——但这个返回的 Task 本身不会被自动 await 或启动,容易造成悬空任务或意外同步执行。

为什么 Func 容易出问题

常见错误是误以为 Task.Run(() => SomeAsyncMethod()) 会正确调度异步操作。实际上:

  • SomeAsyncMethod() 在线程池线程上被**立即调用**,返回一个 Task
  • Task.Run 只负责运行这个委托,**不关心它返回什么**,也不 await 它
  • 如果 SomeAsyncMethod() 内部很快完成(比如直接 return Task.CompletedTask),那整个调用看起来“同步结束”,但真正耗时的 await 部分仍在线程池线程上发生,可能阻塞该线程
  • 更危险的是:若 SomeAsyncMethod() 抛异常,异常会包装进返回的 Task,但这个 Task 没被 await,就变成未观察的异常,.NET 6+ 默认会终止进程

正确写法:用 Func 前必须 await 返回值

如果真要传 Func,必须确保外层代码会 await 它的结果,否则不如不用 Task.Run。典型安全用法只有两种:

绘蛙-多图成片
绘蛙-多图成片

绘蛙新推出的AI图生视频工具

下载
  • 想把「已存在的、未 await 的 Task」丢到线程池等它——但极少需要,因为 Task 本身已可 await
  • 配合 Unwrap() 处理嵌套任务:
    var outer = Task.Run(() => DoAsyncWork()); // 返回 Task
    await outer.Unwrap(); // 等内层 Task 完成

绝大多数场景下,应该直接用 Func 的等价替代:

await Task.Run(() => { /* 同步计算 */ }); // 正确:CPU 密集型工作
await SomeAsyncMethod(); // 正确:本就是异步,无需 Task.Run 包裹

一句话判断该用哪个

只在需要将「纯同步、CPU 密集」代码卸载到线程池时用 ActionFunc 几乎总是错的起点——如果你手头有个 async 方法,别把它塞进 Task.Run,直接 await 它。真正需要 Func 的场合,往往说明你已经在处理多层异步封装,这时更要小心任务生命周期和异常传播。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

PHP 表单处理与文件上传安全实战
PHP 表单处理与文件上传安全实战

本专题聚焦 PHP 在表单处理与文件上传场景中的实战与安全问题,系统讲解表单数据获取与校验、XSS 与 CSRF 防护、文件类型与大小限制、上传目录安全配置、恶意文件识别以及常见安全漏洞的防范策略。通过贴近真实业务的案例,帮助学习者掌握 安全、规范地处理用户输入与文件上传的完整开发流程。

7

2026.01.13

PPT交互图表教程大全
PPT交互图表教程大全

本专题整合了PPT交互图表相关教程汇总,阅读专题下面的文章了解更多详细内容。

56

2026.01.12

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

23

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

135

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号