C# 在c中使用多线程结构是否安全#

C# 在c中使用多线程结构是否安全#,c#,multithreading,C#,Multithreading,我在c#中有一个类ReceiveFaxPrintHelper,我将其实现为Sealed。我还将其作为Singleton实现。我在这个类中定义了一个PrintStoredFaxes方法,我使用锁来保护它 我的问题是,如果我将ReceiveFaxPrintHelper从类更改为结构,这会影响线程吗?Ndepend建议我将其更改为结构而不是类 public sealed class ReceiveFaxPrintHelper { private static AutoResetEvent mJ

我在c#中有一个类ReceiveFaxPrintHelper,我将其实现为Sealed。我还将其作为Singleton实现。我在这个类中定义了一个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)
        {

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

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


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

它不会破坏您的多线程。。。但您应该更详细地了解实际差异:


你知道结构和类之间的区别吗?因为基于这个问题,它看起来不像你做的,你可能想做一些关于这个问题的研究。如果你想要对象的一个实例,你应该使用一个类而不是一个结构。接受至少80%的问题,让人们开始回答你。
ThreadPool.QueueUserWorkItem(new WaitCallback(ReceiveFaxPrintHelper.Instance.PrintStoredFaxes));