實際項目中關於ManualResetEvent的用法

一、在一個線程對應的方法裏,若是想隔幾秒鐘執行一次,那麼在方法裏這樣寫
實際項目中關於ManualResetEvent的用法
實際項目中關於ManualResetEvent的用法
關於ManualResetEvent類
實際項目中關於ManualResetEvent的用法
二、在運行程序的時候(啓動控制檯或啓動服務)啓動GetDSBaseData()方法的線程,該線程是後臺線程
實際項目中關於ManualResetEvent的用法
2.一、我調試發現GetDSBaseData()方法只會在程序啓動的時候執行一次。若是捕獲到異常,執行Set()方法,從新執行一次GetDSBaseData()方法。
實際項目中關於ManualResetEvent的用法
2.二、如下方法UpdateVehicleInfoFromDB()是在上圖中的GetDSBaseData()啓動了一個線程的。如下方法1分鐘執行一次:這是一個死循環,每次執行完方法,使用Thread.Sleep(60 * 1000)語句停頓1分鐘再執行下一次。
實際項目中關於ManualResetEvent的用法
三、首先定義了1個全局的Event對象和1個全局的隊列,因爲實例化Event對象時傳入的是false,因此此對象默認狀態爲「非終止」,寫了WaitOne()方法的線程,首次不會執行,處於等待狀態。緣由是:首次執行隊列裏面都沒有數據,不需執行出隊列操做。
實際項目中關於ManualResetEvent的用法
3.一、有2個線程對這個隊列進行操做,一個線程入隊列,一個線程出隊列。
我發現,在入隊列的線程,須要給這個Even對象,執行.Set()方法,將事件狀態設置爲終止狀態,容許一個或多個等待線程繼續。告訴出隊列的線程,如今隊列裏有數據了,能夠再次執行出隊列的操做了。
調用Set以發出等待線程能夠繼續進行的信號
實際項目中關於ManualResetEvent的用法
3.二、我發現,在出隊列的線程,須要給這個Event對象執行Reset()方法,將事件狀態設置爲非終止狀態,致使線程阻止。因爲這是一個無限循環,因爲執行了Reset(),當下次執行到WaitOne()時,會一直處於等待,直到入隊列把Event對象執行.Set()方法爲止,纔會繼續執行。是爲了防止隊列中沒有數據的時候去執行出隊列的無限循環,浪費系統資源
實際項目中關於ManualResetEvent的用法ide

相關文章
相關標籤/搜索