某些类仅当在 HTTP 请求中调用该类中的某些方法时才需要初始化某些应用程序范围的资源。
此外,初始化会从一些 HTTP/REST 服务请求一些数据。此外,使用异步模式 ( async
/ await
) 异步请求服务资源。
目前,我一直在阻止所有请求,直到使用 aReaderWriterLockSlim
和TryEnterWriteLock
预定义的超时结束初始化。
我的问题是有时会TryEnterWriteLock
以死锁结束,即使没有持有写锁。
我的假设是,不能保证一旦某个awaitable结束其异步操作,由于线程和SynhcronizationContext
在 ASP.NET 上的工作方式,被阻塞的代码会在同一个线程中继续,这意味着写锁永远不会退出。
也许我可以将整个代码移动到 Global.asaxApplication_Start
事件处理程序,但关键是我不想在每个应用程序生命周期中初始化整个资源一次,因为请求的资源已过期并且可能会再次超时请求。
整个问题...
在这种情况下,有异步代码和其他传入的 HTTP 请求应该等到拥有异步等待初始化的请求而不以所谓的死锁结束的情况下,正确的方法是什么?