我有一个功能可以从旧格式“迁移”到新格式。我需要它出现在我的对象的构造函数中,而不是静态构造函数中,因为需要一个参数。我怎样才能让一段代码只执行一次?
对于某些上下文:
class Foo
{
public Foo(string bar)
{
ShouldOnlyExecuteOnce(bar);
}
}
然后用法可以是(每行一个不同的线程)
var f = new Foo("bar");
var fb = new Foo("meh");
etc
如何正确保护“ShouldOnlyExecuteOnce
”方法?
因为这是一种“迁移”类型的函数,所以我希望创建的第一个对象“获胜”并将旧数据迁移到这个新对象中。以后构造的对象不应尝试执行此函数,即使它们的参数不同
最佳答案
您可以使用双重检查锁定。
class Foo
{
private static bool ShouldOnlyExecuteOnceExecuted = false;
private static readonly object Locker = new object();
public Foo(string bar)
{
SetShouldOnlyExecuteOnce(bar);
}
private void SetShouldOnlyExecuteOnce(string bar)
{
if(!ShouldOnlyExecuteOnceExecuted)
{
lock(Locker)
{
if(!ShouldOnlyExecuteOnceExecuted)
{
ShouldOnlyExecuteOnce(bar);
ShouldOnlyExecuteOnceExecuted = true;
}
}
}
}
}
关于c# - 如何在考虑多线程的情况下恰好执行一段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15008308/