gpt4 book ai didi

c# - 有什么方法可以确定在 C# 中等待锁定的线程数?

转载 作者:行者123 更新时间:2023-11-30 19:49:08 26 4
gpt4 key购买 nike

我使用 lock 语句在 C# 中使用简单的锁定。有什么方法可以确定有多少其他线程正在等待获取对象的锁?我基本上想将等待锁的线程数限制为 5。如果第六个线程需要获得锁,我的代码将抛出异常。

最佳答案

这可以通过 Semaphore 类轻松实现。它会为你计数。请注意,在下面的代码中,我使用信号量对等待资源的线程数进行非阻塞检查,然后使用普通的旧 lock 实际序列化对该资源的访问。如果等待资源的线程超过 5 个,则抛出异常。

public class YourResourceExecutor
{
private Semaphore m_Semaphore = new Semaphore(5, 5);

public void Execute()
{
bool acquired = false;
try
{
acquired = m_Semaphore.WaitOne(0);
if (!acquired)
{
throw new InvalidOperationException();
}
lock (m_Semaphore)
{
// Use the resource here.
}
}
finally
{
if (acquired) m_Semaphore.Release();
}
}
}

这种模式有一个显着的变化。您可以将方法的名称更改为 TryExecute 并让它返回一个 bool 而不是抛出异常。这完全取决于您。

请记住,锁表达式中使用的对象不是锁的主题。它仅用作同步代码块的标识符。任何使用相同对象 获取锁的代码块都将被有效地序列化。被“锁定”的是代码块,而不是 lock 表达式中使用的对象

关于c# - 有什么方法可以确定在 C# 中等待锁定的线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4455024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com