仅适用于 2 个线程的锁定方法
Locking method only for 2 threads
我有以下代码:
public void Execute(IJobExecutionContext context)
{
lock (_lockObj)
{
// ... some HTTP job that can take 5 to 30 seconds ...
}
}
当一个活动作业正在工作并且第二个线程进入相同的方法时,我希望它为第二个线程锁定并等待..但是,当它已经为第二个线程锁定时,然后第三个线程进入代码,我希望它退出方法而不是等待并进入作业执行。
我可以使用静态计数器变量,increase/decrease 它的值由作业执行中的线程计数决定。但是我想知道是否已经有更好的做法来解决这个问题。
您正在寻找 System.Threading.Semaphore
.
var sem = new Semaphore(0, 2);
这将创建一个初始值为零且最大值为二的信号量。最多两个线程将能够调用 sem.WaitOne()
而不会阻塞。之后,调用 sem.WaitOne()
的线程将阻塞,直到另一个线程调用 sem.Release()
.
有一个接受超时参数的重载 WaitOne(int timeout)
。如果超时传递零,则调用不会阻塞,并且 return 立即。布尔值 return 表示您是否成功获取信号量。在您的情况下,如果它 returns False,您只需中止操作。
使用容量为 2 的 Semaphore。
我有以下代码:
public void Execute(IJobExecutionContext context)
{
lock (_lockObj)
{
// ... some HTTP job that can take 5 to 30 seconds ...
}
}
当一个活动作业正在工作并且第二个线程进入相同的方法时,我希望它为第二个线程锁定并等待..但是,当它已经为第二个线程锁定时,然后第三个线程进入代码,我希望它退出方法而不是等待并进入作业执行。
我可以使用静态计数器变量,increase/decrease 它的值由作业执行中的线程计数决定。但是我想知道是否已经有更好的做法来解决这个问题。
您正在寻找 System.Threading.Semaphore
.
var sem = new Semaphore(0, 2);
这将创建一个初始值为零且最大值为二的信号量。最多两个线程将能够调用 sem.WaitOne()
而不会阻塞。之后,调用 sem.WaitOne()
的线程将阻塞,直到另一个线程调用 sem.Release()
.
有一个接受超时参数的重载 WaitOne(int timeout)
。如果超时传递零,则调用不会阻塞,并且 return 立即。布尔值 return 表示您是否成功获取信号量。在您的情况下,如果它 returns False,您只需中止操作。
使用容量为 2 的 Semaphore。