当前位置:编程学习 > C#/ASP.NET >>

多线程的同步原来应该这么用

 

 

用单线程的思维去写多线程,真是头痛呀

 

C#中多线程很方便,但是遇到复杂点的任务,同步成了大问题,google到一大堆的方法:

 

lock

 

monitor

 

信号量AutoResetEvent和ManualResetEvent

 

mutex

 

都试过了,可是却总是同步不了,总会有线程在竞争,单线测试没任何问题,多线是的问题总是莫名其妙

 

VS的调试器在多线程下调试几乎能让人崩溃

 

后来冷静下来,终于想明白是怎么回事了:

 

要转变思路,多线程中的代码始终处于竞争状态,也就是CPU在不断轮询,其实CPU始终如此,只不过多线更明显而已

 

想要让代码按顺序执行,可以利用一个辅助线程,不断查询多线程的状态

 

在需要的时候可以利用让ManualResetEvent线程waitone(),辅助线程查询到所有线程状态均为

WaitSleepJoin时,就可以去执行你需要的代码,这样就能完成同步

 

以下为ThreadState定义的枚举常数

 

成员名称

    

Aborted

线程处于Stopped状态中

AbortRequested

已对线程调用了Thread.Abort方法,但线程尚未收到试图终止它的挂起的System.Threading. ThreadAbortException

Background

线程正作为后台线程执行(相对于前台线程而言)。此状态可以通过设置Thread.IsBackground属性来控制

Running

线程已启动,它未被阻塞,并且没有挂起的ThreadAbortException

Stopped

线程已停止

StopRequested

正在请求线程停止。这仅用于内部

Suspended

线程已挂起

SuspendRequested

正在请求线程挂起

Unstarted

尚未对线程调用Thread.Start方法

WaitSleepJoin

由于调用WaitSleepJoin,线程已被阻止

 

摘自 rztyfx的专栏

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,