C#手动线程通知怎么实现
本文小编为大家详细介绍“C#手动线程通知怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#手动线程通知怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
区别与示例AutoResetEvent 和 ManualResetEvent 十分相似。两者之间的区别,在于前者是自动(Auto),后者是手动(Manua)。
你可以先运行下面的示例,再测试两者的区别。
AutoResetEvent 示例:
classProgram{//线程通知privatestaticAutoResetEventresetEvent=newAutoResetEvent(false);staticvoidMain(string[]args){//创建线程newThread(DoOne).Start();//用于不断向另一个线程发送信号while(true){Console.ReadKey();resetEvent.Set();//发生通知,设置终止状态}}publicstaticvoidDoOne(){Console.WriteLine("①等待中,请发出信号允许我运行");resetEvent.WaitOne();Console.WriteLine("②等待中,请发出信号允许我运行");resetEvent.WaitOne();Console.WriteLine("③等待中,请发出信号允许我运行");//...Console.WriteLine("线程结束");}}
ManualResetEvent 类示例:
classProgram{privatestaticManualResetEventresetEvent=newManualResetEvent(false);staticvoidMain(string[]args){newThread(DoOne).Start();//用于不断向另一个线程发送信号while(true){Console.ReadKey();resetEvent.Set();//发生通知,设置终止状态}}publicstaticvoidDoOne(){Console.WriteLine("等待中,请发出信号允许我运行");resetEvent.WaitOne();//后面的都无效,线程会直接跳过而无需等待resetEvent.WaitOne();resetEvent.WaitOne();resetEvent.WaitOne();resetEvent.WaitOne();resetEvent.WaitOne();Console.WriteLine("线程结束");}}
因为 AutoResetEvent 对象在.WaitOne()
方法等待信号完毕后,会自动重置为非终止状态,相当于高速收费站自动闸门,一辆车过去后,机器自动关闸。
ManualResetEvent 相当于人工闸门,打开后编写人工关闭闸门,不然的话闸门会一直处于打开状态。
ManualResetEvent 主要用于更加灵活的线程信号传递场景。
ManualResetEvent 类表示线程同步事件,收到信号时,要想下一次依然生效,必须手动重置该事件。
因为 ManualResetEvent 类跟 AutoManualResetEvent 类十分接近,这里就不赘述了。
它们的使用区别主要是:
AutoResetEvent 类,每次Set()
,跳过一个WaitOne()
。因为会自动恢复设置
,所以下次碰到WaitOne()
会继续等待。
ManualResetEvent 类,Set()
后,不会重置设置
,因此一旦使用了Set()
后,就会一路放通,不会再等待。
其构造函数如下:
其常用方法如下:
ManualResetEventSlim 相对 ManualResetEvent ,当等待时间预计非常短并且事件不跨越进程边界时,可以使用此类来获得比 ManualResetEvent 更好的性能。
从代码使用来看,没有啥区别,主要就是考虑性能下时,两者不同场景。
这里就不对这两个类型赘述了。
读到这里,这篇“C#手动线程通知怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。