我怎样才能使一些代码行只运行一次

本文关键字:运行 一次 代码 | 更新日期: 2023-09-27 18:33:01

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

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

谢谢。

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

我怎样才能使一些代码行只运行一次

您需要注意对"仅一次"限制的解释有多严格。静态方法通常假定是线程安全的;如果你真的想确保你的方法只运行一次,即使在赛车线程的情况下,那么你需要使用同步机制,最简单的例子是lock

private static bool isRun = false;
private static readonly object syncLock = new object();
public void MyMethod()
{
    lock (syncLock)
    {
        if (!isRun)
        {
            Foo();            
            isRun = true;
        }
    }
}

我通常会用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

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

class B
{
  private static bool fooRun = false;
  public static void Foo()
  {
    if (fooRun) { return; }
    ...
    fooRun = true;
  }
}

只需将布尔值传递到构造函数中,无论您是否希望该事物运行?像这样:

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

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

然而,在所有这些情况下,我会说你正在创建全局状态,这几乎总是表明一个糟糕的设计。 以我的拙见,这种问题只是尖叫需要一点"依赖注入"。