2012-06-25 43 views
-1

我有一個類ReceiveFaxPrintHelper在c#中,我實現爲密封。我也實現了這個作爲Singleton。我在這個類中定義了一個方法PrintStoredFaxes,我使用鎖來保護它。正在使用c#中的多線程安全結構#

我有的問題是,如果我改變ReceiveFaxPrintHelper從類到結構,這是否會影響我的線程? Ndepend建議我將其改爲結構而不是類。

public sealed class ReceiveFaxPrintHelper 
{ 
    private static AutoResetEvent mJobCompleted = new AutoResetEvent(false); 
    private bool mPrintStoredFaxesInProgress = false; 
    private object mLockPrint = new object(); 
    private const string mClassName = "ReceiveFaxPrintHelper"; 

    /// <summary> 
    /// Function that prints the Stored Faxes 
    /// </summary> 
    /// <param name="o">completing the delegate message signature</param> 
    public void PrintStoredFaxes(object o) 
    { 
     lock (mLockPrint) 
     { 

我用這個像這樣:

ThreadPool.QueueUserWorkItem(new WaitCallback(ReceiveFaxPrintHelper.Instance.PrintStoredFaxes)); 
+1

你知道的結構和類之間的區別?因爲基於這個問題,它不會像你這樣做,你可能想對這個問題做一些研究。如果你想要一個你的對象的實例,你應該使用一個類而不是結構。 –

+3

接受至少80%的問題讓人們開始回答你。 – AgentFire

回答

1

NDepend的只是誤導你在這裏。單身人士不應該是結構。

但是,沒有發生這樣的錯誤的風險,特別是打破鎖定。 mLockPrint不是一個結構,所以它包含在一個結構中的複製而不是導致它的重複。你也可以使mLockPrint靜態,如果單身人士的行爲是爲鎖而不是整個結構。此外,只要您使用lock語法,您就可以相對安全地防止意外鎖定結構;那只是不能編譯。 Monitor.Enter語法更棘手,因爲它會進行編譯,然後導致鎖定無聲消失(更準確地說,無用的盒裝副本鎖定)。