C# 创建线程方法 C#如何实现多线程

发布时间 - 2026-01-23 00:00:00    点击率:
Thread最底层但需手动管理生命周期;Task是现代首选,代表异步操作而非线程;Parallel适用于并行循环;共享变量必须线程安全。

Threa

d
类启动线程最直接,但需手动管理生命周期

这是最底层的多线程方式,适合需要精确控制线程启停、优先级或前台/后台属性的场景。创建后必须显式调用 Start(),否则线程不会运行。

  • Thread 默认是前台线程,主线程退出时它会强制终止;设 IsBackground = true 可改为后台线程
  • 不能重复调用 Start(),否则抛出 ThreadStateException
  • 不推荐在 ASP.NET Core 等托管环境中直接使用 Thread,容易耗尽线程池资源
  • 示例:
    var t = new Thread(() => Console.WriteLine("Hello"));  
    t.IsBackground = true;  
    t.Start();

Task 是现代 C# 多线程首选,自动调度且支持 async/await

Task 不等于线程——它代表一个异步操作,可能由线程池线程执行,也可能只是 I/O 完成回调,不占用独占线程。

  • Task.Run(() => {...}) 把 CPU 密集型工作交给线程池,比手建 Thread 更轻量
  • 避免在 Task.Run 里调用 async 方法却不 await,会导致“fire-and-forget”,异常无法捕获
  • 若需等待结果,用 await tasktask.Result(后者会阻塞,慎用)
  • 示例:
    var task = Task.Run(() => {  
        Thread.Sleep(1000); // 模拟 CPU 工作  
        return 42;  
    });  
    int result = await task; // 推荐用 await

并行循环用 Parallel.ForParallel.ForEach 更安全

当你要对数组或集合做大量独立计算时,它们比手动开多个 Task 更简洁,且内置了分区、取消和异常聚合机制。

  • 内部基于 Task 实现,但自动处理数据分割和线程协调
  • 遇到异常不会立即中断,而是继续执行其他分片,最后统一抛出 AggregateException
  • 不适用于有强顺序依赖的循环体;若需控制并发度,传入 ParallelOptions.MaxDegreeOfParallelism
  • 示例:
    Parallel.ForEach(items, new ParallelOptions { MaxDegreeOfParallelism = 4 }, item => {  
        Process(item);  
    });

别忽略线程安全:共享变量要加锁或换用线程安全类型

多个线程同时读写同一个字段(比如 int counter)会导致值丢失,这不是概率问题,是必然发生。

  • 简单计数可用 Interlocked.Increment(ref counter),比 lock 更高效
  • 临界区代码用 lock(obj),注意锁对象不能是 this、值类型或字符串常量
  • 集合类如 List 非线程安全;改用 ConcurrentQueueConcurrentDictionary
  • 异步方法中不要用 lock,应改用 AsyncLockSemaphoreSlim.WaitAsync()

真正难的不是启动几个线程,而是判断该不该用线程、用哪种抽象、以及共享状态怎么同步。很多性能问题其实源于误以为“多线程=快”,结果反而因锁争用或上下文切换变得更慢。


# ai  # c#  # .net  # 字符串常量  # gate  # 常量  # for  # foreach  # 字符串  # int  # 循环  # 值类型  # 线程  # 多线程  # 主线程  # Thread  # 并发  # 对象  # this  # 异步  # 多个  # 抛出  # 最底层  # 这是  # 若需  # 几个  # 当你  # 适用于  # 这不是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: EditPlus中的正则表达式实战(6)  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何快速搭建支持数据库操作的智能建站平台?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  如何用PHP快速搭建CMS系统?  Python并发异常传播_错误处理解析【教程】  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  PHP正则匹配日期和时间(时间戳转换)的实例代码  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  教你用AI润色文章,让你的文字表达更专业  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Laravel如何使用Sanctum进行API认证?(SPA实战)  如何打造高效商业网站?建站目的决定转化率  如何在不使用负向后查找的情况下匹配特定条件前的换行符  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  WEB开发之注册页面验证码倒计时代码的实现  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何获取免费开源的自助建站系统源码?  如何确保西部建站助手FTP传输的安全性?  如何获取上海专业网站定制建站电话?  中山网站推广排名,中山信息港登录入口?  北京的网站制作公司有哪些,哪个视频网站最好?  Android中AutoCompleteTextView自动提示  香港服务器网站卡顿?如何解决网络延迟与负载问题?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  iOS验证手机号的正则表达式  Laravel如何使用查询构建器?(Query Builder高级用法)  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何在云服务器上快速搭建个人网站?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  利用JavaScript实现拖拽改变元素大小  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何基于云服务器快速搭建网站及云盘系统?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  微信小程序 配置文件详细介绍  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  网站建设保证美观性,需要考虑的几点问题!  简单实现Android验证码  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何用IIS7快速搭建并优化网站站点?