-1

我在 c# 中有一个类 ReceiveFaxPrintHelper,我将其实现为 Sealed。我也将其实现为单例。我在这个类中定义了一个方法 PrintStoredFaxes,我使用锁来保护它。

我的问题是,如果我将 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));
4

2 回答 2

1

NDepend 只是在这里误导你。单例不应该是结构。

但是,不存在专门破坏锁定的此类错误的风险。 mLockPrint不是结构,因此复制它所包含的结构不会导致其重复。mLockPrint如果单例行为是针对锁而不是针对整个结构的,您也可以将其设为静态。

此外,只要您使用lock语法,就可以相对安全地防止意外锁定结构;那不会编译。Monitor.Enter语法比较复杂,因为它会编译,然后导致锁定的静默消失(更准确地说,盒装副本的无用锁定)。

于 2012-06-25T11:55:34.753 回答
1

它不会破坏您的多线程......但您应该更详细地查看实际差异:

http://msdn.microsoft.com/en-us/library/ms173109

于 2012-06-25T11:55:47.210 回答