锁定方法只适用于2个线程

本文关键字:2个 线程 适用于 方法 锁定 | 更新日期: 2023-09-27 18:04:27

我有以下代码:

public void Execute(IJobExecutionContext context)
{
    lock (_lockObj)
    {
       // ... some HTTP job that can take 5 to 30 seconds ...
    }
}

当一个活动的作业正在工作并且第二个线程进入相同的方法时,我希望它为第二个线程锁定并等待。但是,当它已经为第二个线程锁定时,然后第三个线程进入代码,我希望它退出该方法,而不是等待并进入作业执行。

我可以使用静态计数器变量,并根据作业执行中的线程数增加/减少其值。但是我想知道是否已经有更好的做法来解决这个问题。

锁定方法只适用于2个线程

您要找的是System.Threading.Semaphore

var sem = new Semaphore(0, 2);

创建一个初始值为0,最大值为2的信号量。最多两个线程可以在不阻塞的情况下调用sem.WaitOne()。在此之后,调用sem.WaitOne()的线程将阻塞,直到另一个线程调用sem.Release()

有一个接受超时参数的过载WaitOne(int timeout)。如果传递的超时为0,则调用不会阻塞,并立即返回。布尔返回值指示是否成功获取了信号量。在您的示例中,如果返回False,则只需中止操作。

使用容量为2的信号量