从一个公共类调用静态参数到另一个公共类

时间:2014-05-22 06:44:03

标签: c# static

我正在尝试编写多线程应用,我需要使用Monitoer.Enter/Exit/Wait/Pulse 我已经创建了一个Lock对象,并在它自己的类中使用它

public partial class domain 
    /*I dont sure this is the good practice way to mange DDD Layers (if anybody have a comment about it)*/
{

   Public class Peer2PeerCom
   {
    public static readonly object locker = new object();
    //other stuff here
    //...
    //somwhere here
    Monitor.Pulse(locker);
   }   
}

在我希望/需要的其他类中使用类似

的储物柜
public class Control
{
public domain.Peer2PeerCom Dom_P2PCom = new domain.Peer2PeerCom();
internal void connection ( int port , string IpAdress)
 {
  Monitor.Enter(Dom_P2PCom.locker);
  //do stuff here
  Monitor.wait(Dom_P2PCom.locker);
  //..
  Monitor.Exit(Dom_P2PCom.locker);
 }
}

但是当我尝试时我无法识别locker,我认为这是因为它是static但是我不明白如何在不使整个类静止的情况下纠正它

1 个答案:

答案 0 :(得分:3)

您尝试通过引用访问静态成员。幸运的是,这在C#中不起作用 - 它可能会导致非常容易被误导的代码,例如在Java。

相反,您应该使用类的名称来访问静态成员:

lock (domain.Peer2PeerCom.locker)
{
    ...
    // This should probably be in a while loop...
    Monitor.Wait(domain.Peer2PeerCom.locker);
}

(我已经使用了lock而不是明确地调用Monitor.EnterMonitor.Exit - 它更加惯用,更容易做对 - 在代码中#&}# 39;已经给出,进入监视器后代码中的任何异常都会导致监视器被泄露" - 你将不会退出它。)

一般情况下,我强烈建议反对使用公共静态字段来获取像这样的共享锁。它使很多更难以推断使用锁的内容,而不是它在一个类中是私有的。 (我推荐一般公共字段,以及类名中的下划线,没有特殊原因嵌套的类,以及domain的类名......)