先问一个问题:你还在用 Task.WaitAll 吗?还在循环里无脑地 Task.Run 吗?如果你在真实服务中这么干,那线程池饥饿、响应延迟飙升、异常静默这些坑,早晚会踩上一个。

别觉得这是危言耸听。这两类写法,是很多人在高并发场景下遇到性能瓶颈的直接原因。

Task.Run 什么时候该用、什么时候不该用

关键看任务性质——这是判断的唯一标准。CPU 密集型任务,才适合扔给线程池;IO 密集型任务,包一层 Task.Run 只是自欺欺人。

怎么判断自己是不是踩坑了?观察几个信号:ThreadPool.GetA vailableThreads 返回 0、HTTP 请求超时陡增、日志里看不到异常但接口卡死——这些现象出现时,多半是 Task.Run 用错了地方。

并行等待多个任务:必须用 await Task.WhenAll

Task.WaitAll 是同步阻塞调用,在 ASP.NET Core 或 WinForms 等有同步上下文的环境里,轻则性能归零,重则死锁。这可不是危言耸听。

别碰 Task.Factory.StartNew,除非你真懂 TaskCreationOptions

这个方法的默认行为有点“坑”:它不捕获同步上下文,也不支持 async lambda 的自动展平。如果你写 Task.Factory.StartNew(async () => await DoWork()),得到的是 Task,不是 Task。用 await 去等它,不仅会卡住,异常还会被吞掉。

最后说一个容易被忽略的观点:并行不等于更快。如果所有任务都在争抢同一个锁、共用一个数据库连接池、或反复触发 GC,加再多线程也白搭。先压测,再分析瓶颈,比盲目上 Task.Run 有用得多。

C#怎么使用Task并行库_C# Task和TPL并行编程教程【进阶】

本文转载于:https://www.php.cn/faq/2323318.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。