c# - 如何在考虑多线程的情况下恰好执行一段代码?

标签 c# .net multithreading thread-safety locking

我有一个功能可以从旧格式“迁移”到新格式。我需要它出现在我的对象的构造函数中,而不是静态构造函数中,因为需要一个参数。我怎样才能让一段代码只执行一次?

对于某些上下文:

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/

相关文章:

c# - 如何向 EF Core 中 DbContext 中的每个查询添加参数以保护租户数据?

c# - 我可以修改传递的方法参数吗

java - OpenGL ES - 主线程上的工作太多

c - 如何让 Posix 线程在一定时间后完成其工作?

c# - 如何使用 XNA 加载文件夹中的所有文件?

c# - 仅使用日期时间格式比较日期和显示时间

c# - 适当的互操作清理

c# - 我的 InvokeRequied #2 有什么问题?

c# - Java 客户端使用的 WCF 服务和 WCF 客户端使用的 Java 服务

python - Twisted threading 如何避免深拷贝