0

0

c# 如何创建一个不会在线程池上运行的Task (LongRunning)

幻夢星雲

幻夢星雲

发布时间:2026-01-07 11:23:02

|

322人浏览过

|

来源于php中文网

原创

应使用TaskCreationOptions.LongRunning避免线程池饥饿,它创建独立前台线程而非占用线程池;须用Task.Factory.StartNew()或new Task()+Start(),禁用Task.Run()传该选项,且不可与async/await混用。

c# 如何创建一个不会在线程池上运行的task (longrunning)

为什么要用 TaskCreationOptions.LongRunning

默认情况下,Task.Run()new Task() 创建的任务都交由线程池调度。对短时、高并发的小任务很高效,但遇到长时间运行(如持续监听、阻塞 I/O、CPU 密集型循环)的任务,会占用线程池线程,可能导致线程池饥饿——其他任务排队、响应变慢,甚至 ThreadPool.GetAvailableThreads() 返回值持续偏低。标记 LongRunning 会让 .NET 直接创建一个**独立的前台线程**,不走线程池,避免干扰整体调度。

如何正确创建 LongRunning Task

不能用 Task.Run(..., LongRunning) —— Task.Run() **不接受** TaskCreationOptions 参数。必须用 Task 构造函数 + Start(),或 Task.Factory.StartNew()

  • Task.Factory.StartNew() 是最常用且推荐的方式,支持选项传入
  • 直接 new Task(..., LongRunning) 后必须显式调用 .Start(),否则不会执行
  • 不要混用 async/awaitLongRunningasync 方法返回的是“任务包装器”,底层仍可能回退到线程池;LongRunning 应用于同步执行体
var longTask = Task.Factory.StartNew(() =>
{
    // 这里放真正长时间运行的同步代码
    Thread.Sleep(10000); // 模拟阻塞操作
    Console.WriteLine("Done on dedicated thread");
}, TaskCreationOptions.LongRunning);

常见误用和后果

以下写法看似合理,实则无效或危险:

Visual Studio IntelliCode
Visual Studio IntelliCode

微软VS平台的 AI 辅助开发工具

下载
  • Task.Run(() => { ... }, TaskCreationOptions.LongRunning) → 编译失败:没有匹配的重载
  • Task.Run(() => Thread.Sleep(5000)) → 仍在用线程池线程,5 秒内该线程无法处理其他任务
  • Task.Factory.StartNew(async () => await SomeAsyncMethod())async 委托返回 Task,外层任务极快完成,内部实际仍在线程池上调度
  • 忘记异常捕获:独立线程抛出未处理异常会直接终止进程(.NET Core/.NET 5+ 默认行为),务必在委托内 try/catch

替代方案比对:Thread vs LongRunning Task

有人会想:既然要独占线程,不如直接用 Thread区别在于生命周期管理和统一抽象:

  • Thread 是裸线程,需手动管理 IsBackgroundJoin、异常处理;Task 提供 Wait()ContinueWith()await 等统一等待和组合能力
  • Task with LongRunning 默认创建的是前台线程(IsBackground = false),程序退出前会等待其结束;而手动 new Thread 默认也是前台,但容易被忽略
  • 如果只是想“不阻塞线程池”但又不真需要长时独占,优先考虑异步 I/O(如 FileStream.ReadAsync)或 Task.Delay 等非阻塞方式,而非盲目上 LongRunning

真正需要 LongRunning 的场景其实不多:比如自实现的轮询服务、嵌入式脚本引擎长期运行、某些硬件 SDK 要求固定线程上下文。用错反而增加线程开销和调试难度。

相关专题

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

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

476

2023.08.10

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

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

57

2025.12.01

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

3

2026.01.08

java学习网站汇总
java学习网站汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

正则表达式 删除
正则表达式 删除

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

19

2026.01.08

java 元空间 永久代
java 元空间 永久代

本专题整合了java中元空间和永久代的区别,阅读专题下面的文章了解更多详细内容。

3

2026.01.08

java 永久代和元空间
java 永久代和元空间

本专题整合了java中元空间和永久代的区别,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

java成品网站源码资源大全
java成品网站源码资源大全

本专题整合了java成品网站源码相关内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.08

java过滤器教程大全
java过滤器教程大全

本专题整合了java过滤器相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.08

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号