WPF-09 ManualResetEventSlim信号量

业务场景如下:WPF应用程序后台有个定时任务在接收PLC硬件数据(该线程接收完数据之后, 会重新启动一个新线程继续接收.....),当应用程序关闭时, 我们得确保接收PLC硬件数据的线程完成之后,再关闭应用程序,否则会造成数据丢失。

上面的业务场景是前一段时间一个朋友向我请教WPF的问题,项目中有一个ManualResetEventSlim类 ,不知道这个类是干什么的。由于本人从事WPF的工作将近10年,在项目中用到过不少与线程相关联的类,所以在这做个简单介绍,做过C/S架构的朋友对多线程接触会更多,那么线程与线程之间是如果通信呢?就是通过ManualResetEventSlim类来完成,其实这个类和ManualResetEvent功能上是一样。ManualResetEventSlim 更轻量级一些。我们解释一下这个类具体用法:

static void MRES_SetWaitReset()
{System.Threading.ManualResetEventSlim mres1 = new System.Threading.ManualResetEventSlim(false); // initialize as unsignaledSystem.Threading.ManualResetEventSlim mres2 = new System.Threading.ManualResetEventSlim(false); // initialize as unsignaledSystem.Threading.ManualResetEventSlim mres3 = new System.Threading.ManualResetEventSlim(true);  // initialize as signaled// Start an asynchronous Task that manipulates mres3 and mres2var observer = Task.Factory.StartNew(() =>{mres1.Wait();Console.WriteLine("observer sees signaled mres1!");Console.WriteLine("observer resetting mres3...");mres3.Reset(); // should switch to unsignaledConsole.WriteLine("observer signalling mres2");mres2.Set();});Console.WriteLine("main thread: mres3.IsSet = {0} (should be true)", mres3.IsSet);Console.WriteLine("main thread signalling mres1");mres1.Set(); // This will "kick off" the observer Taskmres2.Wait(); // This won't return until observer Task has finished resetting mres3Console.WriteLine("main thread sees signaled mres2!");Console.WriteLine("main thread: mres3.IsSet = {0} (should be false)", mres3.IsSet);// It's good form to Dispose() a ManualResetEventSlim when you're done with itobserver.Wait(); // make sure that this has fully completedmres1.Dispose();mres2.Dispose();mres3.Dispose();
}

当前方法有两个线程:主线程和oberver子线程。应用程序运行时,这两个线程同时执行,oberver子线程调用mres1.Wait(),所以使oberver子线程处于等待。主线程继续运行,当调用mres1.Set()主线程会给oberver子线程发个信号,主线程对oberver子线程说:"ok,oberver子线程你可以继续运行了",这时oberver线程mres1.Wait()收到该信号后,不再等待,继续执行下面代码。主线程执行到 mres2.Wait();方法时,这时主线程会挂起,处于等待状态,这时oberver子线程继续执行,当oberver子线程运行到mres2.Set(); oberver子线程会给主线程发送一个信号,oberver子线程会对主线程说:"OK,主线程可以运行了",于是mres2.Wait()不再等待,会继续运行. OK, 这就是这个方法的大体执行流程.

总结:ManualResetEventSlim类

  • Wait()方法内部检测到IsSet属性的值,如果为false,线程会挂起。如果为IsSet为ture,线程不会挂起会继续执行。

  • Reset()会将IsSet设置成false。

  • Set() 会将这IsSet设置成true。 

备注:Wait()内部通过轮训来判断这个值.来决定时候处于等待状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【bzoj3033】太鼓达人 DFS欧拉图

题目描述 给出一个整数K,求一个最大的M,使得存在一个每个位置都是0或1的圈,圈上所有连续K位构成的二进制数两两不同。输出最大的M以及这种情况下字典序最小的方案。 输入 一个整数K。 输出 一个整数M和一个二进制串,由一个空格分隔…

Redis 集合处理

学习了列表之后,发现了Redis处理字符串的功能强大。 为了适应不同场景的需求,还有一个用的很多的就是集合。 Redis提供的集合支持的类型是字符串。并且集合中的元素值是唯一的,也就是说不能出现重复数据。 而且,集合的实现是通过哈…

fpga mysql_FPGA的一些琐碎知识整理

1.生产FPGA的厂家有:ALTERAXILINXATCELLatticeps:Altera和Xilinx主要生产一般用途FPGA,其主要产品采用SRAM工艺Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺ps: 熔丝,顾名思义:把丝熔掉,反…

使用增量备份修复DG中的GAP

问题描述 oracle中DG出现主备不同步现象,alert日志报警有gap信息,但是v$archive_gap视图查不到任何信息。同时主库上的对应归档已经删除且没有备份 解决方案 1.查询备库的scn SQL> select current_scn from v$database; 这时有可能出来的scn是以科学计…

C# 反射类Assembly用法举例

概述程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类、函数、变量等来实例化它们,执行它们,操作它们,实际上就是获取程序在内存中的映像,然后基于这个映像进行各种操作。Assemb…

团队作业

团队&组员: 没有组名,大概是因为我们组虽然有10个人,但是好像只起到人多的地方就容易开车搞笑,没有内涵,取出来的都是秋名山吴彦组这样的开车组名,在大家的的强烈建议和玩笑中,决定了没有组…

算法系列【希尔排序】篇

常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:关于时间复杂度:1. 平方阶 (O(n2)) 排序各类简单排序:直接插入、直接选择和冒泡排序。2. 线性对数…

sql查询索引语句_sql优化总结--基于sql语句优化和索引优化

概述最近做查询,统计和汇总。由于数据量比较庞大,大部分表数据上百万,甚至有的表数据上千万。所以在系统中做sql优化比较多,特此写一篇文章总结一下关于sql优化方面的经验。导致查询缓慢的原因1、数据量过大2、表设计不合理3、sql…

电商行业运维实践

电商行业运维实践--------------------…

数据结构小总结(成都磨子桥技工学校数据结构前12题)

[pixiv] https://www.pixiv.net/member_illust.php?modemedium&illust_id34352147 暑假的作业,颓颓的我总算是写完了 线段树 线段树是一个高级玩意,不仅可以求区间和,区间最大等等的简单问题,灵活运用还有好多变种。自从学…

【九章算法免费讲座第一期】转专业找CS工作的“打狗棒法”

讲座时间: 美西时间6月5日18:30-20:00(周五) 北京时间6月6日09:30-11:00(周六a.m) 讲座安排: 免费在线直播讲座 报名网址: http://t.cn/R2XgMSH&a…

golang mysql 防注入_Go,Gorm 和 Mysql 是如何防止 SQL 注入的

Go,Gorm 和 Mysql 是如何防止 SQL 注入的SQL 注入和 SQL 预编译技术什么是 SQL 注入所谓SQL注入(sql inject),就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说&#xff…

wav2midi 音乐旋律提取算法 附可执行demo

前面提及过,音频指纹算法的思路。 也梳理开源了两个比较经典的算法。 https://github.com/cpuimage/shazam https://github.com/cpuimage/AudioFingerprinter 后来一段时间,稍微看了下这两个算法,还有不少可以精简优化的空间。 例如抗噪&…

全新升级的AOP框架Dora.Interception[5]: 实现任意的拦截器注册方式

Dora.Interception提供了两种拦截器注册方式,一种是利用标注在目标类型、属性和方法上的InterceptorAttribute特性,另一种采用基于目标方法或者属性的调用表达式。通过提供的扩展点,我们可以任何我们希望的拦截器注册方式。目录一、IIntercep…

SCAU 算法课的题

8594 有重复元素的排列问题(优先做) 时间限制:1000MS 内存限制:1000K提交次数:1610 通过次数:656 题型: 编程题 语言: G;GCC;VC Description 设集合R{r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。 试着设计一个算法&am…

react 数组新增_React 新特性 Hooks 讲解及实例(二)

本文是 React 新特性系列的第二篇,第一篇请点击这里:React 新特性讲解及实例什么是 HooksHook 是 React 16.8 的新增特性。它可以让你在不编写 类组件 的情况下使用 state以及其他的 React 特性。类组件的不足状态逻辑复用难缺少复用机制渲染属性和高阶组…

智课雅思词汇---二十二、-al即是名词性后缀又是形容词后缀

智课雅思词汇---二十二、-al即是名词性后缀又是形容词后缀 一、总结 一句话总结: 后缀:-al ②[名词后缀] 1、构成抽象名词,表示行为、状况、事情 refusal 拒绝 proposal 提议 withdrawal 撤退 1、名词性后缀acy是什么意思? 后缀&a…

javascript事件处理程序

javascript 事件处理程序 1、普通事件处理程序 <input type"button" value"click me" οnclick"showMessage()" /> function showMessage(){alert("clicked");} 2、DOMO 级事件处理程序 <span style"white-space:pre&…

eclipse新发现功能之dos和terminal(ssh连接)

dos功能&#xff1a; window——》show view——》other——》remote systems&#xff0c;选择remote shell&#xff0c;选择确定或者双击&#xff0c;打开了一个新工具窗口。点击remote shell窗口最右上角的小三角&#xff0c;在launch子菜单中选择local&#xff0c;点击即可。…

7天学会python_7天学会Python最佳可视化工具Seaborn(五):结构化展示多维数据

当探索具有中等数量(不多不少的意思……)维度的数据集时&#xff0c;一个很好的方式是基于不同的子数据集构建不同的实例&#xff0c;并将它们以网格的方式组织在一张图之中。这种技术有时被称为“lattice”或“trellis”(大概是格子图、网格图)&#xff0c;这跟“small multip…