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.pswp.cn/news/281970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281970.shtml
英文地址,請注明出處:http://en.pswp.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…