Skip to main content
 首页 » 编程设计

c#之仅适用于 2 个线程的锁定方法

2024年01月26日27落叶无声

我有以下代码:

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

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

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

请您参考如下方法:

您正在寻找System.Threading.Semaphore .

var sem = new Semaphore(0, 2); 

这将创建一个初始值为零且最大值为二的信号量。最多两个线程将能够调用 sem.WaitOne() 而不会阻塞。之后,调用 sem.WaitOne() 的线程将阻塞,直到另一个线程调用 sem.Release()。

存在重载 WaitOne(int timeout)接受超时参数。如果超时传递零,调用将不会阻塞,并立即返回。 bool 返回值表示您是否成功获取了信号量。在您的情况下,如果它返回 False,您只需中止操作即可。