是否有类似于C#中的锁的构造跳过一段代码而不是阻塞?

car*_*ter 3 c# multithreading nonblocking

在我正在处理的代码片段中,另一个开发人员的库以常规的预定时间间隔触发我的一个对象的方法.我遇到的问题是,在达到另一个时间间隔时,前一次对我的对象方法的调用尚未完成,并且第二次调用我的方法再次执行 - 这两个线程最终相互踩踏.我希望能够通过检查包装方法的实现来查看它是否处于处理过程中并跳过块(如果是这样).

一个锁类似于我想要的,但是并没有完全覆盖它,因为一个锁将阻塞,并且一旦前一个实例释放锁,对我的方法的调用就会恢复.这不是我想要发生的事情,因为我可能最终会备份大量这些调用并且等待逐个处理.相反,我想要一个类似于锁的东西,但没有块,所以执行将在通常被锁包围的代码块之后继续.

我想出的是一个与Interlocked.Increment和Interlocked.Decrement一起使用的计数器,允许我使用一个简单的if语句来确定该方法的执行是否应该继续.

public class Processor
{
    private long _numberOfThreadsRunning = 0;

    public void PerformProcessing()
    {
        long currentThreadNumber Interlocked.Increment(ref _numberOfThreadsRunning);
        if(currentThreadNumber == 1)
        {
            // Do something...
        }
        Interlocked.Decrement(ref _numberOfThreadsRunning);
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得我在思考这个问题,可能会有一个更简单的解决方案.

Mar*_*wul 7

Monitor.TryEnter如果返回false,您可以调用并继续.