gpt4 book ai didi

.net - C# - 只允许一个锁处理,让所有其他锁等待,然后退出而不执行

转载 作者:行者123 更新时间:2023-12-03 12:49:30 25 4
gpt4 key购买 nike

我有一个多个用户可以调用的流程。这是一个非常昂贵的查询,但它应该只需要每 5 分钟左右运行一次来​​刷新一些存档数据。我现在有一个锁,这样我们就不会一次运行该进程多次,这会使系统崩溃,但每个用户都必须等待之前的锁运行后才能运行。如果有 3-4 个用户在等待锁定,则第 4 个用户必须等待 20 分钟以上才能运行他们的查询。

我想做的是锁定这个对象并在第一次请求时运行查询。如果有任何其他请求进来,让它们等待当前锁定完成,然后返回而不实际执行查询。

.Net 中是否有任何内置的东西可以实现这一点,或者我是否需要为此锁编写一些特定的代码?

最佳答案

您可以使用 ManualResetEvent 来做到这一点和一把锁。

private object _dataLock = new object();
private ManualResetEvent _dataEvent = new ManualResetEvent(false);

private ArchiveData GetData()
{
if (Monitor.TryEnter(_dataLock))
{
_dataEvent.Reset(); // makes other threads wait on the data

// perform the query

// then set event to say that data is available
_dataEvent.Set();
try
{
return data;
}
finally
{
Monitor.Exit(_dataLock);
}
}

// Other threads wait on the event before returning data.
_dataEvent.WaitOne();
return data;
}

因此第一个到达那里的线程获得锁并清除_dataEvent,表明其他线程将不得不等待数据。这里存在竞争条件,如果第二个客户端在 _dataEvent 重置之前到达那里,它将返回旧数据。我认为这是可以接受的,考虑到它是存档数据并且发生这种情况的机会窗口非常小。

其他通过的线程尝试获取锁,失败并被 WaitOne 阻塞。

当数据可用时,执行查询的线程设置事件、释放锁并返回数据。

请注意,我没有将整个锁体放在 try...finally 中。参见 Eric Lippert 的 Locks and Exceptions do not mix原因。

关于.net - C# - 只允许一个锁处理,让所有其他锁等待,然后退出而不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17154732/

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