你能在.Net中锁定单个应用程序变量吗?

3
在 .Net web服务中,您可以像这样设置应用程序级变量:
application("Stackoverflow") = "Stack"
application("Serverfault") = "Server"

如果您收到多个请求,可以先锁定、然后更新、最后解锁。
try
  application.lock()
  application("Serverfault") = "Fault"
finally
  application.unlock()
end try

现在,这会锁定所有的应用程序变量,有没有一种方法只锁定单个应用程序变量?而不是一次锁定所有应用程序变量?

1
你应该知道,应用程序级变量的主要存在理由是为了向后兼容传统的ASP应用程序。对于现代ASP.NET应用程序来说,有更好的解决方案,比如使用在类中受锁保护的静态字段(C#)或SyncLock(VB.NET)语句。 - Joe
2个回答

1
有趣的是,我正在研究另一个问题,我想这个问题提供了我需要的答案。
这个:
  Using mutex = New Mutex(False, "LockServerFault")
      mutex.WaitOne()
      application("ServerFault") = "Fault"                                      
      mutex.ReleaseMutex()
  End Using

完成与以下代码相同的功能:

try
  application.lock()
  application("Serverfault") = "Fault"
finally
  application.unlock()
end try

但它并不锁定所有应用程序变量,只是防止单个应用程序变量在同一时间被更新。这使我能够在不使所有线程暂停应用程序变量的情况下,在不同的线程中更新不同的应用程序变量。


很好,谢谢。我在尝试弄清楚如何在ASP.NET Core中获取单例MemoryCache时找到了这个问题,因为Application.Lock不再存在。 - Brian Birtle

0

请参阅Application.Lock的文档。

Lock方法会阻止其他客户端修改存储在Application对象中的变量,确保每次只有一个客户端可以更改或访问Application变量。

所以看起来答案是否定的。除非您提供自己的自定义锁定策略并放弃使用Application.Lock(),即使这样,我也不确定状态如何在Application中持久化,如果整个状态在更改时进行序列化,则肯定无法实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接