2012-09-28 12 views
3

我目前編寫C#WPF應用程序。我需要從三個線程讀取/寫入變量的同步訪問。該變量被聲明爲應用程序主窗口類的成員。因此,我宣佈它通過以下方式:我可以使用屬性中的C#鎖定運算符來同步對讀/寫變量的訪問嗎?

public partial class MainWindow : Window 
{ 
    . . . . . 
    #region Fields 
    /// <summary> 
    /// The variable myVar to synchronous access for read/write. 
    /// </summary> 
    private static Double myVar; 
    #endregion 
    . . . . . 
} 

我可以提供以下列方式將其同步接入:

1)定義同步對象作爲主窗口類的成員

public partial class MainWindow : Window 
{ 
    . . . . . 
    #region Fields 
    /// <summary> 
    /// This object is controlling the synchronous access for read/write to myVar. 
    /// </summary> 
    private static Object syncObj; 
    #endregion 
    . . . . . 
} 

2)在主窗口類中定義的下一個屬性

public partial class MainWindow : Window 
{ 
    . . . . . 
    #region Properties 
    /// <summary> 
    /// This property supports synchronous access to myVar for read/write. 
    /// </summary> 
    public static Double MyVar 
    { 
     lock(syncObj) 
     { 
      get{ return myVar; } 
      set{ if(myVar != value) myVar = value; } 
     } 
    } 
    #endregion 
    . . . . . 
} 

威爾這個屬性以正確的方式工作?它是否可以確保同步訪問的方法可讀取/寫入myVar變量?我不想使用volatile或方法作爲Thread.VolatileRead和Thread.VolatileWrite,因爲很多人說鎖操作符工作得更好,並允許編譯器優化代碼。

+0

搜索「C#的存儲柵欄」(或「屏障」)的一些有趣的讀取(和導致http://stackoverflow.com/questions/6581848/memory-barrier-generators和類似) – 2012-09-28 06:13:34

回答

1

這似乎精絕爲,只要在主窗口不引用私有變量本身,而是PROPERT。

lock Statement (C# Reference)

鎖定關鍵字由 獲得用於給定對象的互斥鎖,執行 語句,然後釋放鎖標誌着一個語句塊作爲關鍵部分。

鎖定關鍵字確保而另一個線程是在臨界段一個線程不進入代碼的臨界 部。如果 另一個線程試圖輸入一個鎖定的代碼,它將等待,阻止, ,直到對象被釋放。

另一個有趣的選項,看看可能是ReaderWriterLockSlim Class

表示要用於管理對資源的訪問, 允許讀取或獨佔訪問多個線程編寫

+0

所以我可以使用MyVar的屬性爲讀同步訪問/從線程寫入myVar的變量,並同步將優秀的? – user1688773

+0

我確實相信它應該是。 –

+0

關鍵部分只是需要的一部分;幸好'鎖'也有記憶障礙保證.. – 2012-09-28 06:16:22

0

我認爲你的方法沒有什麼錯,因爲StackOverflow用戶很傷心。就我個人而言,我還建議你看看ReaderWriterLockSlim類,因爲它在代碼執行過程中相對於同步過程看起來非常有趣。只要遵循這些規則

lock (this) is a problem if the instance can be accessed publicly. 

lock (typeof (MyType)) is a problem if MyType is publicly accessible. 

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock. 
相關問題