0

0

C# Task使用方法 C#如何使用Task进行异步操作

星降

星降

发布时间:2026-01-22 08:41:02

|

853人浏览过

|

来源于php中文网

原创

Task.Run适合CPU密集型工作(如计算、图像处理),避免阻塞UI;HTTP/文件等I/O操作应优先用原生async方法;不可在Task.Run中包裹await表达式或async方法而不await。

c# task使用方法 c#如何使用task进行异步操作

Task.Run 适合什么场景

它适合把 CPU 密集型工作(比如大量计算、图像处理、JSON 解析)从主线程移出去,避免阻塞 UI 或响应。不是所有异步都该用 Task.Run——比如 HTTP 请求、文件读写,应优先用原生 async 方法(如 HttpClient.GetAsyncFile.ReadAllTextAsync),它们底层不占线程。

  • Task.Run(() => ComputeHeavyWork()) 包裹纯计算逻辑,别包 await 表达式
  • 不要在 Task.Run 里调用另一个 async 方法却不 await,否则会得到一个未等待的 Task
  • ASP.NET Core 中过度使用 Task.Run 可能增加线程池争用,反而降低吞吐量

await Task.WhenAll 和 await Task.WhenAny 的区别

Task.WhenAll 等待所有任务完成才继续;Task.WhenAny 一有任一任务完成(成功/异常/取消)就返回,常用于超时控制或竞速请求。

var tasks = new[] {
    DownloadAsync("url1"),
    DownloadAsync("url2"),
    DownloadAsync("url3")
};
// 等全部完成
var results = await Task.WhenAll(tasks);

// 只等第一个完成(比如取最快响应)
var first = await Task.WhenAny(tasks);
var result = await first;
  • Task.WhenAll 抛出异常时,会聚合所有子任务的异常(AggregateException),需遍历 InnerExceptions
  • Task.WhenAny 返回的是 Task,必须再 await 才能得到结果值
  • 两者都不改变原任务的执行状态,只是观察行为

忘记 await Task 导致的“火球”问题

声明了 async 方法却没 await 其返回的 Task,编译器不报错,但任务可能被丢弃、异常静默丢失、资源未释放——这就是常说的“fire-and-forget”陷阱。

笔尖Ai写作
笔尖Ai写作

AI智能写作,1000+写作模板,轻松原创,拒绝写作焦虑!一款在线Ai写作生成器

下载
  • 除非明确设计为后台任务(且已加异常捕获和日志),否则不要直接调用 DoSomethingAsync() 而不 await
  • 若真要忽略结果,至少用 _ = DoSomethingAsync(); 显式表明意图,并确保内部有 try/catch
  • 在 ASP.NET Core 控制器中直接丢弃 Task,可能导致请求提前返回而后台任务仍在跑,引发状态不一致

Task.Delay 不是 Thread.Sleep 的异步替代品

Task.Delay 是非阻塞的计时器,不占用线程;Thread.Sleep 是同步阻塞,会卡死当前线程。在 async 方法中误用 Thread.Sleep,等于把异步代码写成了伪异步。

public async Task DoWorkAsync()
{
    // ✅ 正确:不占线程,可被调度器挂起
    await Task.Delay(1000);

    // ❌ 错误:同步阻塞,整个 async 流程卡住 1 秒
    Thread.Sleep(1000);
}
  • Task.Delay 支持 CancellationToken,可用于实现可取消的等待
  • 它底层基于 System.Threading.Timer,开销远低于新建线程或轮询
  • 在 Unity 或某些受限环境里,Task.Delay 可能不可用,需改用协程或平台特定 API
真正难的不是调用 await,而是判断哪个操作该用原生异步、哪个该扔给线程池、哪个根本不能丢弃——这些边界往往藏在业务逻辑深处,而不是语法里。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

417

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

310

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

线程和进程的区别
线程和进程的区别

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

482

2023.08.10

线程和进程的区别
线程和进程的区别

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

482

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

63

2025.12.01

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

378

2023.11.09

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

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

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