多线程-2
System.Threading名称空间中的部分类型
Interlocket 为被多个线程共享访问的类型提供院子操作。
Monitor 使用锁定和等待信号来同步线程对象。C#的lock关键字在后台使用的就是Monitor对象
Mutex 互斥体,可用于应用程序域边界之间的同步。
ParameterizedThreadStart 委托,它允许线程调用包含任意多个参数的方法
Semaphore 用于限制对一个资源或一类资源的并发访问的线程数量
Thread 代表CLR中执行线程。使用这个类型,能够在初始的应用程序域中创建额外的线程
ThreadPool 用于和一个进程(由CLR维护的)线程池交互
ThreadPriority 代表了线程调度的优先级别(Highest Normal等)
ThreadStart 该委托定义一个线程调用的方法(无参)和ParameterizedThreadStart委托不同,后者提供一个有参方法。
ThreadState 代表线程处于的状态(Running Aborted等)
Timer 提供以指定的时间间隔执行方法的机制(不太稳定,个人测试,最好用DispatcherTimer)
TimerCallback 该委托类型应与Timer类型一起使用
Thread类型的主要静态成员:他是一个面向对象的包装器,包装特定应用程序域中的某个执行单元(方法)。
静态成员:
CurrentContext 只读属性,返回当前线程的上下文
CurrentThread 只读属性,返回当前线程的引用
GetDomain()和GetDomainID() 返回当前应用程序域的引用或当前线程正在运行的域的ID
Sleep() 将当前线程挂起指定时间
主要的实例级成员:
IsAlive 返回布尔值,指示线程是否开始
IsBackgroud 获取或设置一个值,只是线程是否为后台线程(后台线程不会阻塞主线程,即主线程结束后后台线程自动结束,也可以说前台线程优于一切后台线程)
Name 给线程指定友好的名字
Priority 获取或设置线程调度的优先级(没什么用处)
ThreadState 获取当前线程的状态
Abort() 通知CLR尽快终止本线程
Interrupt() 中断当前线程
Join() 阻塞调用线程,直到某个(调用Join()的)线程终止为止
Resume() 使以挂起的线程继续执行
Start()通知 CLR尽快执行本线程
Suspend()挂起当前线程,如果线程已经挂起,调用Suspend()则不起作用
线程创建步骤:
Thread th=new Thread(new ThreadStart(
()=>{
Console.WriteLine("running in second thread,thread id is:{0}",Thread.CurrentThread.ManagedThreadId);
}
));
th.Start();
主线成中的方法优于线程方法,会首先执行。因此下面需要通过同步方式来实现线程调用
控制。
AutoResetEvent类,为解决上面问题提供依据:
方法:1.private AutoResetEvent waitHandler=new AutoResetEvent(false)
2.在线程的最后加入:waitHandler.Set(); //用于设置线程结束,类似p-v操作 用于通知其他线程,该线程已经结束
3.在线程调用后主线程方法前加上:waitHandler.waitOne();//等待,直到收到通知,通知由waitHandler.set()执行。
前台线程和后台线程:isBackground true 为后台线程
前台线程能阻止应用程序终结,后台线程不会。一直到所有的前台线程终止后,CLR才能关闭应用程序(即卸载承载的应用程序域)
后台线程:(有时也叫守护线程,Daemon thread) 被CLR认为是程序执行中可作出牺牲的途径,即在任何时候,应当应用程序域卸载时,所有的后台线程也会被自动终止。
并发问题
Thread[] threads=new Thread[10];
for(int i=0;i<10;i++){threads[i]=new Thread(new ThreadStart(p.PrinterNumbers());
foreach(Thread t in threads){t.Start();}
//以上10个线程同时执行时,并不是按顺序执行的。会出现因为时间片分配导致乱序问题。
因此需要同步。
同步方法1.使用lock()关键字进行同步,lock(this){同步的代码块,即共享代码块}
如果试图锁定静态方法中的代码,只需要生命一个私有静态对象成员变量作为锁定标记即可。
同步方法2.使用System.Threading.Monitor类型进行同步
try{ Monitor.Enter(threadLock) }catch(Exception ex){}finally{ monitor.Exit(threadLock)}
同步方法3:System.Threading.Interlocked 类型进行同步
System.Threading.Interlocked类型的部分静态成员
CompareExchange() 安全的比较两个值是否相等,如果相等,将第3个值与其中1搁置交换
Decrement()安全递减1
Exchane()安全地交换数据
Increment() 安全递加1
同步方法4:使用[Synchronization]特性进行同步
位于System.Runtime.Remoting.Contexts命名空间
[Synchronization]标记的类、方法 都在同步上下文中,简单但缺乏灵活性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!