2012-06-25 21 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语法更棘手,因为它会进行编译,然后导致锁定无声消失(更准确地说,无用的盒装副本锁定)。