C# 如何锁定方法内容

C# 如何锁定方法内容,c#,multithreading,locking,C#,Multithreading,Locking,我有一个可以从多个线程调用的方法,但我只希望第一个线程在该方法中执行一些逻辑。所以,我计划使用一个布尔变量。进入的第一个线程将布尔变量设置为false(以防止更多线程进入),并执行方法逻辑 使用此方法的后续线程将检查布尔变量。因为第一个线程将其设置为false,所以他们将跳过方法逻辑 在代码中,类似以下内容: private void myMethod() { if (firsTime) //set to true in the constructor { firstT

我有一个可以从多个线程调用的方法,但我只希望第一个线程在该方法中执行一些逻辑。所以,我计划使用一个布尔变量。进入的第一个线程将布尔变量设置为false(以防止更多线程进入),并执行方法逻辑

使用此方法的后续线程将检查布尔变量。因为第一个线程将其设置为false,所以他们将跳过方法逻辑

在代码中,类似以下内容:

private void myMethod()
{
   if (firsTime)  //set to true in the constructor
   {
      firstTime = false; //To prevent other thread to come inside here.
      //method logic
   }
}
我想使用lock来执行此操作,但不确定放在哪里

如果我在“If”中锁定以将firstTime更改为false,那么可能有2个或更多线程已经进入If(不希望这样)

如果我锁在“If”之外将firstTime更改为false,那么如果firstTime已经设置为false,那么第一个线程如何进入If内部执行方法逻辑呢

我的问题是:如何使锁具有所需的功能?(第一个线程设置布尔值并执行方法逻辑)


我无法锁定所有的方法逻辑,因为这将是一个非常耗时的操作。

您可以使用
Interlocked.Exchange
来解决此问题。它将给定变量的值设置为指定的值,并返回该变量中以前的值,并且它将以原子方式完成所有操作。这样做将确保只有一个线程会运行
中的代码,如果

private static int isFirst = 1;
public static void Foo()
{
    if (Interlocked.Exchange(ref isFirst, 0) == 1)
    {
        //DoStuff
    }
}
请注意,
互锁。Exchange
没有接受
bool
的重载,这就是为什么您必须使用
int
(或其他类型)而不是
1
表示真,而
0
表示假

如果您想要使用
锁定
而不是
联锁
的解决方案,您可以通过使用附加的本地
布尔
值来实现:

private static bool isFirst = true;
private static object key = new object();
public static void Foo()
{
    bool amFirst;
    lock (key)
    {
        amFirst = isFirst;
        isFirst = false;
    }

    if (amFirst)
    {
        //DoStuff
    }
}

我只想在ctor中调用方法逻辑,但可能只有我:)谢谢。这是我的解决方案:)我想我应该把“如果你想要一个使用
lock
..的解决方案”改为“如果你真的非常想要一个使用
lock
..”的解决方案,
interlocted
的方式更容易遵循。@retailcoder我把
interlocted
的解决方案放在第一位是有原因的,但关于哪个更好,这主要是主观的。如果可以使用
bool
,我希望
联锁解决方案更好;被迫使用int作为
bool
会对其可读性造成相当大的伤害。代码中的一点小注释可以解释
int
的原因。。。尽管如此,+1仍然是一个很好的答案,并给出了两种方法。@retailcoder我确实添加了一条注释,解释了为什么需要使用
int
<代码>“请注意,Interlocked.Exchange没有接受bool的重载,这就是为什么您必须使用int(或其他类型)来代替,使用1表示true,0表示false。”