如何使一些代码行只运行一次

时间:2012-05-03 18:36:01

标签: c#

同一个程序集中的两个类:Class AStatic Class B

ClassA的方法中,我在ClassB中调用一个方法,但是我希望只调用一次,而不是每次都调用那个方法ClassA ... 目前我正在设置一个全局属性-Ran - 以查看该方法是否已经运行过......好吧它有效但我觉得这不是最好的设计。我想知道是否有更好的方法来做同样的事情?

感谢。

ClassA.MyMethod(...)
{
....
//.... 
if (ClassB.Ran != 1)
    ClassB.Foo();
....
//...
}

5 个答案:

答案 0 :(得分:9)

您需要注意“唯一一次”限制的严格程度。静态方法通常被认为是线程安全的;如果你真的想确保你的方法只运行一次,即使是赛车线程,那么你需要使用同步机制,最简单的例子是lock

private static bool isRun = false;
private static readonly object syncLock = new object();

public void MyMethod()
{
    lock (syncLock)
    {
        if (!isRun)
        {
            Foo();            
            isRun = true;
        }
    }
}

答案 1 :(得分:7)

我通常会使用Lazy<T>

执行此操作

考虑:

public static class Test // this is your ClassB
{
    private static Lazy<string> m_Property = new Lazy<string>( ()=>
    {
        Console.WriteLine("Lazy invoked"); 
        return "hi";
    },true);
    public static string Property
    {
        get
        {
            Console.WriteLine("value request");
            return m_Property.Value;
        }
    }
}

//....consuming code, this is in your ClassA somewhere

var test1 = Test.Property; // first call, lazy is invoked
var test2 = Test.Property; // cached value is used, delgate not invoked
var test3 = Test.Property; // cached value is used, delgate not invoked
var test4 = Test.Property; // cached value is used, delgate not invoked
var test5 = Test.Property; // cached value is used, delgate not invoked

这是输出:

value request
Lazy invoked
value request
value request
value request
value request

答案 2 :(得分:4)

您可以在类上使用私有静态字段,以便在第一次调用方法时设置结果,防止它再次运行:

class B
{
  private static bool fooRun = false;

  public static void Foo()
  {
    if (fooRun) { return; }
    ...
    fooRun = true;
  }
}

答案 3 :(得分:1)

只要将bool传递给构造函数,无论你是否想要运行它?类似的东西:

ClassA(bool runA)
{
    if (runA) 
    {
        ClassB.Foo();
    }
}

答案 4 :(得分:1)

没有更多细节,很难说,但听起来B类中的这个方法包含某种初始化逻辑。如果只是在第一次引用类B时需要发生的事情,那么你可以将它放在类B的静态构造函数中。如果类B中的方法只需要在引用类A时运行,那么它可能是从类A的静态构造函数调用。如果在调用类A的某个方法之前无法调用它,并且它应该只从任何地方调用一次,那么我会说你应该从内部检查类B中的私有静态变量如果已经调用了该方法并立即返回。否则,作为最后的手段,我会说在A类中拥有一个私有静态变量会优于全局变量。

然而,在所有这些情况下,我都说你正在创造全球状态,这几乎总是表明设计不佳。在我看来,这种问题只是尖叫着需要一点“依赖注入”。