我在 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/