2012-01-09 65 views
1

這是一個不尋常的問題;我絕不會建議在典型的.NET開發中用ManualResetEvent替換布爾值。在這種情況下,我已經需要一個ManualResetEvent來指示到另一個線程的連接狀態;鑑於此,對我而言,使用具有相同語義含義的布爾值是多餘的。ManualResetEvent是否可以取代布爾值

OK,具體:我有一個工作線程當滿足下列條件爲真應處理消息:

  • 「客戶」 連接
  • 「收件人」 連接

的「客戶端「和」收件人「連接是其他線程正在監視的TCP套接字;當連接狀態改變時,相應的WaitHandle將被設置(連接)或重置(斷開)。

最初,我有一個布爾值表示連接狀態(用於UI)。現在我正在使用WaitHandles來發信號通知工作線程,看起來有利於完全消除布爾狀態變量並僅使用WaitHandles。

waitEvent.WaitOne(0) 

返回手柄的狀態,而不會阻塞,使其在功能上等同於測試一個布爾值(與線程安全操作的額外優點)。

因此,鑑於我已經將要使用WaitHandles,並且我不喜歡將狀態(相同的語義含義)維護成兩個不同變量的想法,我有什麼理由不能使用WaitHandles?我能想到的最重要的反駁是運行時性能:測試布爾與時間來測試WaitHandle的時間;但我認爲業績不會受到顯着影響。

我錯過了什麼重要的嗎?

謝謝!

回答

0

剛剛使用ManualResetEvent的好處是您只有一個變量跟蹤相同的狀態。但是,正如你所提到的那樣,讀取狀態將會產生開銷。

你必須問這個開銷是否足夠大,足以證明在兩個地方跟蹤同一個狀態並使它們失去同步的風險。

+0

我的想法。在所有其他條件都相同的情況下,我傾向於認爲運行時間性能差異不值得在我從現在開始的6到12個月內更新設計時出現混亂的風險。 – 2012-01-09 19:13:49

+0

我想你已經回答了你自己的問題。不,我不介意讓我的答案或任何東西的額外代表:) – FMM 2012-01-09 21:58:20

+0

是的,但我認爲這是值得一個「理智檢查」,以防萬一我失去了一些東西。作爲一名獨立開發人員,我經常錯失與其他有經驗的開發人員合作的機會;所以你已經贏得了額外的代表。 – 2012-01-10 18:33:41

0

有多種辦事方式。這是其中的一種情況。假設您正確使用布爾值,應該沒有區別。一個考慮因素是內存(對象需要更多的布爾值),但最可能的是很小的。我會推薦一個,但是因爲你使用線程來表示事件,所以我會建議WaitHandles,因爲這些是他們設計的目的。