2013-05-18 44 views
0

我有一定困難的設計方式我的代碼應該工作:方式適當在C#中使用線程工作

  1. 串行#1(隨時接收數據)調用程序()如果一些特定的接收值是>CONSTANT1,但只有當程序()沒有運行,否則只有最後調用將程序()結束
  2. 串行#2(在任何添接收數據後運行e)列出Ç與所接收的數據
  3. 程序()檢查Ç>CONSTANT2並保存Ç到文件
  4. 定時器(每N個秒)運行另一個例程,檢查保存的文件併發送電子郵件(在不影響例程(),同時保存BC

我現在的設計採用了對全局布爾的,但我認爲這是產生了一些問題(由於布爾檢查,並再次將其設置爲啓動「鎖定」程序)之間進行切換。

那麼,建議如何解決這樣的同步問題?鎖定(someGlobalObject)?,使用Monitor? (我如何放棄多個掛起的例程()調用?),Mutex?,Semaphore?

謝謝!

回答

0

首先,鎖定和監視器在功能上是相同的。
Lock statement vs Monitor.Enter method

現在,通常,當我在寫多線程代碼,決定或者是ReaderWriterLock(ReaderWriterLockSlim如果在.NET 3.5或更高版本)和鎖()之間。如果有多個線程需要寫入同一個對象而只有少數需要讀取,則lock()會更好。如果讀取的併發數據比讀寫的頻率更高(並且來自多個線程),ReaderWriterLocks的性能會更好。

ReaderWriterLock vs lock{}

如果我正確理解你的榜樣,B和C是由多個線程訪問的對象。它看起來像是從一個線程寫入並從另外兩個線程讀取。所以,我建議這一切都取決於讀寫的頻率。如果B和C的寫入頻率比讀取頻率高得多,請嘗試使用lock()語句。否則,如果更頻繁地閱讀它們,請使用ReaderWriterLock(Slim)對象。顯然,你需要運行一些測試來確定一個是否比另一個好。任何一個人都應該解決這個問題,儘管最有可能會比另一個更快。

相關問題