【问题标题】:Can you lock a single application variable in .Net?您可以在 .Net 中锁定单个应用程序变量吗?
【发布时间】:2017-08-31 08:23:14
【问题描述】:

在 .Net Web 服务中,您可以像这样设置应用程序级变量

application("Stackoverflow") = "Stack"
application("Serverfault") = "Server"

如果您收到多个请求,您可以简单地锁定,然后更新,然后解锁

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

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

【问题讨论】:

  • 您应该知道,应用程序级变量的主要存在理由是向后兼容旧的 ASP 应用程序。对于现代 ASP.NET 应用程序,有更好的解决方案,例如在受锁 (C#) 或 SyncLock (VB.NET) 语句保护的类中使用静态字段。

标签: asp.net web-services locking


【解决方案1】:

请参阅Application.Lock 上的文档。

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

所以看起来答案是否定的。除非您提供自己的自定义锁定策略并放弃使用Application.Lock(),否则我不确定状态如何在Application 中保持不变,如果整个状态在更改时被序列化,那么您绝对不能这样做.

【讨论】:

    【解决方案2】:

    有趣的是,我正在研究一个不同的问题,我认为这为我发布的问题提供了解决方案。

    这个:

      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
    

    但它不会锁定所有应用程序变量,但它确实会阻止单个应用程序变量同时被更新。这使我能够在不同的线程中更新不同的应用程序变量,而不会让所有线程都为不适用于它们的应用程序变量而暂停。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-23
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多