我在 ASP.NET 应用程序中使用第三方 Web 服务。对第 3 方 Web 服务的调用必须同步,但 ASP.NET 显然是多线程的,并且可能会发出多个页面请求,从而导致对第 3 方 Web 服务的同时调用。对 Web 服务的调用封装在自定义对象中。我的想法是将对象存储在应用程序变量中,并使用 C# lock 关键字强制同步使用它。
我很紧张,因为我对多线程概念很陌生,并且我读到您不应该锁定公共对象(我的应用程序变量实际上是)。我还读到,如果锁定的代码块失败(如果 Web 服务失败,则可能会出现这种情况),那么它可能会破坏应用程序域的稳定并导致应用程序崩溃。
我应该提到的是,我的网站中很少使用第 3 方 Web 服务,并且同时发出 2 个请求的情况也很少见。
以下是我如何调用 Web 服务的粗略代码示例:
ThirdPartWebService objWebService = Application["ThirdPartWebService"] As ThirdPartWebService;
lock (objWebService)
{
objWebService.CallThatNeedsToBeSynchronized();
}
你应该创建一个private static readonly object _lock = new object();
在进行 Web 服务调用的类中,并将其用作锁。由于该对象是静态的,因此在整个应用程序中只会有其中一个,如果您愿意的话,可以是 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)
)。请记住,这意味着,如果您有多个方法,则对一个方法的调用也会阻止所有其他方法,这就是为什么您通常不应该锁定它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)