c# - 锁定 ASP.NET 应用程序变量

标签 c# asp.net multithreading locking

我在 ASP.NET 应用程序中使用第三方 Web 服务。对第 3 方 Web 服务的调用必须同步,但 ASP.NET 显然是多线程的,并且可能会发出多个页面请求,从而导致对第 3 方 Web 服务的同时调用。对 Web 服务的调用封装在自定义对象中。我的想法是将对象存储在应用程序变量中,并使用 C# lock 关键字强制同步使用它。

我很紧张,因为我对多线程概念很陌生,并且我读到过您不应该锁定公共(public)对象(我的应用程序变量实际上就是这样)。我还了解到,如果锁定的代码块失败(如果 Web 服务失败,则可能会出现这种情况),那么它可能会破坏应用程序域的稳定性并导致应用程序崩溃。

我应该提到,我的网站中很少使用第 3 方 Web 服务,并且同时发出 2 个请求的情况也很少见。

以下是我如何调用 Web 服务的粗略代码示例:

ThirdPartWebService objWebService = Application["ThirdPartWebService"] As ThirdPartWebService;
lock (objWebService)
{
  objWebService.CallThatNeedsToBeSynchronized();
}

最佳答案

您应该在进行 Web 服务调用的类中创建一个 private static readonly object _lock = new object();,并将其用作锁。由于该对象是静态的,因此在整个应用程序中只会有其中一个,如果您愿意,可以是 Singleton 对象 (http://en.wikipedia.org/wiki/Singleton_pattern)

public class MyWebServiceWrapper
{
   private static readonly object _lock = new object();

   public void CallWebService()
   {
      lock(_lock)
      {
         var objWebService = (ThirdPartWebService)Application["ThirdPartWebService"];
         objWebService.CallThatNeedsToBeSynchronized();
      }
   }
}

如果进行 WebService 调用的类不执行任何其他操作,您也可以只对此进行锁定 (lock(this))。请记住,这意味着,如果您有多个方法,则对一个方法的调用也会阻止所有其他方法,这就是为什么您通常不应该锁定它。

关于c# - 锁定 ASP.NET 应用程序变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413001/

相关文章:

c# - XML 解析和转换(XSLT 或其他)

c# - 可以以声明方式设置 TextBox 文本吗?

asp.net - ASP.NET 路由和 IIS 处理程序映射如何交互?

c - 使用线程调试段错误

c# - 运算符 '==' 不能应用于类型 'System.DBNull' 和 'Int' 的操作数

c# - 将字节字符串转换为十六进制字符串的内置函数

java - 实现 keylistener 和 jpanel 的单独类

c - 如何并行运行任务?

c# - 从运行时加载的XSD创建有效的XML(无xsd.exe)

c# - 身份验证/PrincipalPermission 不起作用