gpt4 book ai didi

c# - ASP.NET 多线程 & "thread has already entered the lock"

转载 作者:行者123 更新时间:2023-11-30 18:09:48 24 4
gpt4 key购买 nike

在 ASP.NET 应用程序中,我有一个受 ReaderWriterLockSlim 保护的资源。

普通请求调用EnterReadLock,访问资源,调用ExitReadLock返回。

有一次,我不小心忘记在代码中的某处调用 ExitReadLock。在下一个请求中,我得到一个异常,表明线程已经进入锁中。

足够公平:如果在请求 A 结束时线程没有退出锁,而同一个线程用于处理请求 B,并试图进入锁,它会抛出。

现在,我的问题:是否可能出现以下情况?原因?

  • 线程开始处理请求A
  • 线程进入锁
  • 线程确实,比如说, sleep ,或者做一些 IO,因此变得可用
  • 同一个 线程开始处理请求 B,而请求 A 处于“暂停”状态
  • 线程进入锁!! throw !!

如果是,我还有什么其他解决方案可以保护上述资源?请记住,我想使用 ReaderWriterLockSlim,因为我还有其他可能写入资源的线程?

编辑:添加一些细节:

1) 这发生在生成、缓存和提供图像的 HttpHandler 的 ProcessRequest 方法中。这些图像的生成成本很高。因此,第一个请求将生成并缓存图像,我们希望在生成时暂停其他请求。

2) 我们没有尝试“重现”——目前我们正在尝试了解是否有可能 相同 线程在已经等待图像准备就绪。

3) 我知道 LockPolicyRecursion,但我不确定我是否完全理解它的用途,以及在我们的案例中是否可以将它设置为 SupportsRecursion。

编辑:更进一步...

根据下面 Ryan 指出的文档,只要我们不参与异步操作,线程就会阻塞并且不会返回池。因此,一旦我们锁定等待 EnterReadLock 完成的线程,它就不会返回到池中,也不会处理任何其他请求。

所以 1) 我们应该是安全的,但是 2) 我们可能会耗尽线程池。假设我们不想立即返回一个虚拟的“请稍候”图像,我们有什么解决方案?

最佳答案

是的,这在 ASP.NET 中是可能的。在某些地方(异步等),ASP.NET 会进行线程切换并针对单个请求(在不同的点)使用不同的线程,这意味着完全有可能在请求进行到一半时该线程继续处理 < em>另一个请求。

您在管道中的哪些点获取/释放锁?你能减少这个吗?就我个人而言,我会将线程持续时间限制为一些与 UI/表示代码分离的同步方法。它不会在同步方法的中间更改线程。

关于c# - ASP.NET 多线程 & "thread has already entered the lock",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2229181/

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