C#多线程系列之手动线程通知
区别与示例
autoresetevent 和 manualresetevent 十分相似。两者之间的区别,在于前者是自动(auto),后者是手动(manua)。
你可以先运行下面的示例,再测试两者的区别。
autoresetevent 示例:
class program { // 线程通知 private static autoresetevent resetevent = new autoresetevent(false); static void main(string[] args) { // 创建线程 new thread(doone).start(); // 用于不断向另一个线程发送信号 while (true) { console.readkey(); resetevent.set(); // 发生通知,设置终止状态 } } public static void doone() { console.writeline("① 等待中,请发出信号允许我运行"); resetevent.waitone(); console.writeline("② 等待中,请发出信号允许我运行"); resetevent.waitone(); console.writeline("③ 等待中,请发出信号允许我运行"); // ... console.writeline("线程结束"); } }
manualresetevent 类示例:
class program { private static manualresetevent resetevent = new manualresetevent(false); static void main(string[] args) { new thread(doone).start(); // 用于不断向另一个线程发送信号 while (true) { console.readkey(); resetevent.set(); // 发生通知,设置终止状态 } } public static void doone() { 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()
后,就会一路放通,不会再等待。
其构造函数如下:
构造函数 | 说明 |
---|---|
manualresetevent(boolean) | 用一个指示是否将初始状态设置为终止的布尔值初始化 manualresetevent 类的新实例。 |
其常用方法如下:
方法 | 说明 |
---|---|
close() | 释放由当前 waithandle 占用的所有资源。 |
reset() | 将事件状态设置为非终止,从而导致线程受阻。 |
set() | 将事件状态设置为有信号,从而允许一个或多个等待线程继续执行。 |
waitone() | 阻止当前线程,直到当前 waithandle 收到信号。 |
waitone(int32) | 阻止当前线程,直到当前 waithandle 收到信号,同时使用 32 位带符号整数指定时间间隔(以毫秒为单位)。 |
waitone(int32, boolean) | 阻止当前线程,直到当前的 waithandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。 |
waitone(timespan) | 阻止当前线程,直到当前实例收到信号,同时使用 timespan 指定时间间隔。 |
waitone(timespan, boolean) | 阻止当前线程,直到当前实例收到信号为止,同时使用 timespan 指定时间间隔,并指定是否在等待之前退出同步域。 |
manualreseteventslim
manualreseteventslim 相对 manualresetevent ,当等待时间预计非常短并且事件不跨越进程边界时,可以使用此类来获得比 manualresetevent 更好的性能。
从代码使用来看,没有啥区别,主要就是考虑性能下时,两者不同场景。
这里就不对这两个类型赘述了。
到此这篇关于c#多线程系列之手动线程通知的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Dojo 1.7发布