c#之线程基础(一)
可以认为线程是一个虚拟进程,用于独立运行一个特定的程序。
1.使用c#创建线程
using System; using System.Threading; //3 namespace MutiThreadDemo { class Program { static void Main(string[] args) {
//5 Thread t = new Thread(PrintNumber); t.Start(); PrintNumber(); Console.ReadLine(); } //4 static void PrintNumber() { Console.WriteLine("Starting ..."); for(int i = 1;i< 10; i++) { Console.WriteLine(i); } } } }
在上面的代码中,步骤4定义了方法 PrintNumber , 该方法会被主线程和新创建的线程使用。
在我们构造一个线程时,ThreadStart 或 ParameterizedThreadStart 的实例委托会传给构造函数。
我们只需指定在不同线程运行的方法名,而 c# 编译器则会在后台创建这些对象。
运行结果:两组范围为1 -10的数字会随机交叉输出。这说明了PringNumber方法同时运行在主线程和另一个线程。(如果10个数字随机交叉不明显,可以增加到100试试)
2.暂停线程
这里展示如何让一个线程等待一段时间而不用消耗操作系统资源。
using System; using System.Threading; namespace MutiThreadDemo { class ThreadSleep { static void Main(string[] args) { Thread t = new Thread(PrintNumbersWithDelay); t.Start(); PrintNumbers(); Console.ReadLine(); } static void PrintNumbers() { Console.WriteLine("Starting ..."); for (int i = 0; i < 10; i++) { Console.WriteLine(i); } } static void PrintNumbersWithDelay() { Console.WriteLine("Starting ..."); for(int i = 0; i < 10; i++) { Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine(i); } } } }
在PrintNumbersWithDeplay方法中加入了Thread.Sleep方法调用。这会导致线程在执行该代码时,在打印任何数字之前会等待指定的时间(这里是2秒钟)。
3.线程等待
这里将展示如何让程序等待另一个程序中的计算完成,然后在代码中使用该线程的计算结果。
使用Thread.Sleep行不通,因为并不知道计算需要花费的具体时间。
using System; using System.Threading; namespace MutiThreadDemo { class Thread_Join { static void Main(string[] args) { Console.WriteLine("Starting ..."); Thread t = new Thread(PrintNumbersWithDeplay); t.Start(); t.Join(); Console.WriteLine("Thread completed"); Console.ReadLine(); } static void PrintNumbersWithDeplay() { Console.WriteLine("Starting ..."); for (int i = 1; i < 10; i++) { Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine(i); } } } }
运行结果:
当程序运行时,启动了一个耗时较长的线程来打印数字,打印每个数字前要等待两秒。
但是我们在主程序中调用了 t.Join 方法,该方法允许我们等待直到线程 t 完成。
当线程 t 完成时,主程序会继续运行。
借助该技术可以实现在两个线程间同步执行步骤。
4.终止线程
...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现