当前位置: 首页 > news >正文

C#基础10

分线程

通常指的是如何开启一个独立于主程序(主线程)之外的执行流,让程序能够“一心二用”。比如,主界面保持流畅响应用户点击,而后台线程在默默下载大文件或处理复杂计算。

从最基础的底层实现到现代的高级写法:

1、基础方式:使用Thread类

这是最直观的“分线程”方式,直接对应操作系统层面的线程。

特点:你需要手动管理线程的生命周期(创建、启动、停止).

使用场景:需要长时间运行、且需要精细控制线程属性(如优先级、前台/后台)的任务。

using System;

using System.Threading;

class Program

{

static void Main()

{

// 1. 创建线程,指定要执行的方法

Thread newThread = new Thread(DoWork);

// 设置为后台线程(主程序退出时,该线程也会自动结束)

newThread.IsBackground = true;

// 2. 启动线程 newThread.Start();

Console.WriteLine("主线程继续执行,不被阻塞...");

}

static void DoWork()

{

// 这里是在分线程中执行的代码

for (int i = 0; i < 5; i++)

{

Console.WriteLine($"分线程工作中... {i}");

Thread.Sleep(500); // 模拟耗时操作

}

}

}

现代推荐方式:使用Task(任务并行库)

这是目前.NET开发中的标准做法。它不直接创建线程,而是利用线程池(ThreadPool)来复用线程,效率更高。

特点:轻量级,自动管理线程资源,支持返回结果。

适用场景:绝大多数后台计算任务。

using System;

using System.Threading.Tasks;

class Program

{

static void Main()

{

// 使用 Task.Run 将工作推送到线程池

Task.Run(() =>

{

// 这里的代码在分线程(线程池线程)中运行

LongRunningCalculation();

});

Console.WriteLine("主线程立即返回,继续处理其他事情...");

Console.ReadLine();

}

static void LongRunningCalculation()

{

// 模拟耗时计算 Task.Delay(2000).Wait();

Console.WriteLine("计算完成!");

}

}

异步方式:async/await

如果你希望分线程的任务完成后,能“通知”主线程继续做某事(例如:下载完成后更新界面),使用这种方式最优雅。

特点:代码写起来像同步代码,不会阻塞界面(UI线程)。

使用场景:I/O操作(文件读写、网络请求)或需要等待任务结果的场景。

using System;

using System.Threading.Tasks;

class Program

{

static async Task Main()

{

Console.WriteLine("开始任务...");

// await 会等待任务完成,但不会卡死主线程

await Task.Run(() =>

{

// 模拟耗时工作

Thread.Sleep(2000);

});

Console.WriteLine("任务完成,继续后续操作!");

}

}

方式核心类优点缺点
底层线程System.Threading.Thread控制力最强,可设置优先级资源开销大,创建销毁慢
任务并行System.Threading.Tasks.Task性能高,利用线程池,代码简洁无法直接控制具体线程属性
异步编程async/await极大提升代码可读性,UI不卡顿需要理解状态机原理

给新手的特别提示

  1. 不要“卡死”线程池:在使用Task.Run或线程池时,千万不要在里面使用Thread.Sleep()来模拟长时间等待。这会占用宝贵的线程池资源。如果是等待,请使用Task.Delay()
  2. 线程安全问题:一旦开启分线程,如果多个线程同时修改同一个变量(比如全局计数器),数据就会乱掉。这时你需要使用lock关键字来加锁保护。
  3. 前台与后台:默认创建的Thread是前台线程,它会阻止程序关闭。如果你想让程序关闭时,分线程也跟着自动结束,记得设置thread.IsBackground = true

你可以先尝试用Task.Run写一个简单的分线程程序,这是目前最通用的做法。如果有具体的代码需求,随时发给我!

http://www.jsqmd.com/news/774987/

相关文章:

  • SD-PPP:打破Photoshop与AI绘图壁垒的专业级插件解决方案
  • Claude Code异步编程插件:基于钩子系统的事件驱动通知机制
  • 使用cutlass模板跑各种量化gemm的example
  • YOLOv11-seg 改进系列 | 引入原创 RSCD 重参数共享卷积分割头,增强 Head 表达力并压低计算量
  • 2026十大AIToken聚合平台深度解读,多模型聚合调用技术升级分析
  • 第五篇:MySQL锁机制——从行锁到间隙锁
  • ML Visuals:解锁机器学习可视化表达力的100+专业资源
  • 【学术生存指南2026】:错过AISMM,你的NSFC申报、顶会投稿与跨学科合作将系统性降维
  • 【EAI(企业应用集成)工具】Asteria warp簡単紹介(アステリア ワープ)
  • 用Python 和 java 写 10 道题
  • MCP协议赋能:Qdrant向量数据库的标准化AI应用集成实践
  • 基于PHP+Swoole与RAG的AI应用私有化部署全栈实战
  • 特斯拉Model 3/Y CAN总线数据采集终极指南:5分钟掌握车辆系统监控
  • uni-app 全能日历组件,支持农历、酒店预订、打卡签到、价格日历多种场景
  • 5分钟快速上手!Calibre豆瓣插件终极安装指南,轻松获取中文图书元数据
  • AI编程助手集成Codex CLI:MCP协议实现智能代码分析与本地模型部署
  • AI原生OPC项目路演实录分享
  • 怎么配置中转站,稳定的爽用gpt 5.5,附cc switch + codex 配置教程
  • 第六篇:Redo Log与Binlog——崩溃恢复的底层保障
  • AutoJS Pro9.3最新文档详解与入门教程
  • Arm架构通用定时器原理与应用全解析
  • Flutter for OpenHarmony 学习路线实战:从环境搭建到跨端数据持久化全流程解析
  • MYSQL的视图
  • Termi AI:基于Electron的智能桌面开发伴侣,集成Vite预览与AI编程助手
  • 第七篇:慢查询分析与SQL优化实战
  • copilot学生认证按键无法点击
  • golang如何实现桌面应用热更新_golang桌面应用热更新实现攻略
  • MyBatis 高频八股文:从 Mapper 到缓存,一篇搞懂常见面试题
  • Python配置管理实战:从环境变量到类型安全,详解Tanuki单文件库设计
  • #81_闲谈语言的分类