我怎样才能使一些代码行只运行一次
本文关键字:运行 一次 代码 | 更新日期: 2023-09-27 18:33:01
同一程序集中的两个类:Class A
和 Static
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 类中拥有一个私有静态变量比全局变量更可取。
然而,在所有这些情况下,我会说你正在创建全局状态,这几乎总是表明一个糟糕的设计。 以我的拙见,这种问题只是尖叫需要一点"依赖注入"。