2014-11-06 185 views
0

我有一個典型的生產者/消費者問題,並嘗試同步2個線程。 我想在C#Compact Framework中找到Suspend()和Resume()的替代方法。他們倆的arent CF支持:( 我發現了一些例子,它們都基於的EventWaitHandle和使用這樣的:。如何暫停和恢復線程

 private EventWaitHandle ewh = new AutoResetEvent(); 

但問題是,同樣的AutoResetEvent心不是Compact Framework中的一部分,我想知道是否有一個是解決在使用的EventWaitHandle這種生產者/消費者煩惱的另一種方式。 我知道的AutoResetEvent是從的EventWaitHandle的。的EventWaitHandle的其他子類,你知道有哪些?

+1

監控類是瑞士軍刀的同步。很多谷歌命中「.net監視器生產者消費者算法」,不要發明自己的。 – 2014-11-06 17:40:58

回答

1

當你發現,沒有自動復位事件。但是你可以使用pinvoke解決CreateEvent和WaitForSingleObject等問題。 或者,如果你簡單想要將訪問同步到一個對象,只需使用Lock與'Lock'對象。所述用途是在僞代碼:

線程1 而(真){ 鎖(myLockObject){ 訪問共享對象(一個或多個) } Thread.sleep代碼(1000) }

線程2 而(真){ 鎖(myLockObject){ 訪問共享對象(一個或多個) } Thread.sleep代碼(1100) }

每個線程將鎖定相同​​的對象一次只有一個線程可以訪問共享對象。只有當鎖對象沒有被另一個代碼行鎖定時(這裏是另一個線程),鎖內的代碼纔會運行。您可以簡單地使用它來「暫停」並恢復一個線程。 Lock對象被設計爲允許對共享變量的同步訪問。

正如已經提到的,OTOH只是針對原生的CreateEvent,WaitForSingleObject,SetEvent API函數進行銷售。

0

我必須道歉,Compact Framework中確實有AutoResetEvent。 感謝Hans Passant建議使用Monitor類進行同步。