JL.*_*JL. 5 .net web-services asmx
我有一个asmx Web服务,只允许一次响应1个客户端.
换句话说,如果服务被客户端A调用,而服务器B调用,我希望B挂起,直到A完成,然后B才能得到服务.
如果这太复杂,那么在A接入服务的过程中,来自B的最低限度的呼叫将失败并且用户定义的错误.
原因是该服务在很大程度上依赖于IO操作和XML序列化,因此至关重要的是该服务不会被多个客户端同时调用.
提前致谢
static object _LockObject = new object();
void WebServiceCall()
{
lock(_LockObject)
{
// Do work...
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个您调用lock()的静态对象。该lock()语句将阻止其他调用执行其中的代码,直到获得锁的第一次执行完成。
请注意,根据您的超时设置,B 可能会因超时而失败,具体取决于 A 完成所需的时间。
更新:是的,您可以使用Monitor类代替lock(). 您可以使用Monitor.TryEnter()方法来检查对象是否已锁定(即:是否想返回错误而不是等待)。
更多细节:
来自http://msdn.microsoft.com/en-us/library/aa664735(VS.71).aspx:
形式的锁定语句
lock (x) ...
Run Code Online (Sandbox Code Playgroud)
其中 x 是引用类型的表达式,精确等于
System.Threading.Monitor.Enter(x);
try {
...
}
finally {
System.Threading.Monitor.Exit(x);
}
Run Code Online (Sandbox Code Playgroud)
来自http://msdn.microsoft.com/en-us/library/de0542zz.aspx:
使用 Enter 获取作为参数传递的对象上的监视器。如果另一个线程已经对该对象执行了 Enter,但尚未执行相应的 Exit,则当前线程将阻塞,直到另一个线程释放该对象。
因此,这只是设计使代码知道阻塞而不是跳过。如果您愿意,可以使用 Monitor.TryEnter() 方法跳过。