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