首页 > 作文

C#多线程系列之手动线程通知

更新时间:2023-04-05 00:18:56 阅读: 评论:0

区别与示例

autoretevent 和 manualretevent 十分相似。两者之间的区别,在于前者是自动(auto),后者是手动(manua)。

你可以先运行下面的示例,再测试两广东体育大学者的区别。

autoretevent 示例:

    class program    {  最新伤感签名      // 线程通知        private static autoretevent retevent = new autoretevent(fal);        static void main(string[] args)        {            // 创建线程            new thread(doone).start();            // 用于不断向另一个线程发送信号            while (true)            {                console.readkey();                retevent.t();           // 发生通知,设置终止状态            }        }        public static void doone()        {            console.writeline("① 等待中,请发出信号允许我运行");            retevent.waitone();            console.writeline("② 等待中,请发出信号允许我运行");            retevent.waitone();            console.writeline("③ 等待中,请发出信号允许我运行");                        // ...            console.writeline("线程结束");        }    }

manualretevent 类示例:

    class program    {        private static manualretevent retevent = new manualretevent(fal);        static void main(string[] args)        {            new thread(doone).start();            // 用于不断向另一个线程发送信号            while (true)            {                console.readkey();                retevent.t();           // 发生通知,设置终止状态            }        }        public static void doone()        {            console.writeline("等待中,请发出信号允许我运行");            retevent.waitone();            // 后面的都无效,线程会直接跳过而无需等待            retevent.waitone();            retevent.waitone();            retevent.waitone();            retevent.waitone();            retevent.waitone();            console.writeline("线程结束");        }    }

因为 autoretevent 对象在.waitone()方法等待信号完毕后,会自动重置为非终止状态,相当于高速收费站自动闸门,一辆车过去后,机器自动关闸。

manualretevent 相当于人工闸门,打开后编写人工关闭闸门,不然的话闸门会一直处于打开状态。

manualretevent 主要用于更加灵活的线程信号传递场景。

manualretevent 类

表示线程同步事件,收到信号时,要想下一次依然生效,必须手动重置该事件。

因为 manualretevent 类跟 automanualretevent 类十分接近,这里就不赘述了。

它们的使用区别主要是:

autoretevent 类,每次t(),跳过一个waitone()。因为会自动恢复设置,所以下次碰到waitone()会继续等待。

manualretevent 类,六一儿童节祝福孩子语短句t()后,不会重置设置,因此一旦使用了t()后,就会一路放通,不会再等待。

其构造函数如下:

构造函数说明manualretevent(boolean)用一个指示是否将初始状态设置为终止的布尔值初始化 manualretevent 类的新实例。

其常用方法如下:

方法说明clo()释放由当前 waithandle 占用的所有资源。ret()将事件状态设置为非终止,从而导致线程受阻。t()将事件状态设置为有信号,从而允许一个或多个等待线程继续执行。waitone()阻止当前线程,直到当前 waithandle 收到信号。waitone(int32)阻止当前线程,直到当前 waithandle 收到信号,同时使用 32 位带符号整数指定时间间隔(以毫秒为单位)。waitone(int32, boolean)阻止当前线程,直到当前的 waithandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。waitone(timespan)阻止当前线程,直到当前实例收到信号,同时使用 timespan 指定时间间隔。waitone(timespan, boolean)阻止当前线程,直到当前实例收到信号为止,同时使用 timespan 指定时间间武汉军事经济学院隔,并指定是否在等待之前退出同步域。

manualreteventslim

manualreteventslim 相对 manualretevent ,当等待时间预计非常短并且事件不跨越进程边界时,可以使用此类来获得比 manualretevent 更好的性能。

从代码使用来看,没有啥区别,主要就是考虑性能下时,两者不同场景正割余割函数图像。

这里就不对这两个类型赘述了。

到此这篇关于c#多线程系列之手动线程通知的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-05 00:18:54,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/e5388b9dc93e42370ae45c88e82a5440.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C#多线程系列之手动线程通知.doc

本文 PDF 下载地址:C#多线程系列之手动线程通知.pdf

标签:线程   信号   状态   闸门
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图