web服务方法中的对象锁定

本文关键字:对象 锁定 服务 方法 web | 更新日期: 2023-09-27 17:57:56

有一个简单的web服务方法,如下所示:

public string AppendOne(string ID)
{
    Thread.Sleep(5000);
    return ID+"One";    
}

我想防止这个方法同时处理多个具有相同参数(ID)的调用。

例如,Client1使用参数"ABC"调用了此方法。在它完成之前,如果Client2使用相同的参数"ABC"调用相同的方法,它应该等待Client1完成它的作业,然后启动。如果Client3同时使用参数"DEF"调用该方法,则应在不等待的情况下进行处理。

如何通过对象锁定实现这一点?

我尝试了这个方法,假设String对象指向内存中的同一地址,但没有成功。

public string AppendOne(string ID)
{
    lock (ID)
    {
         Thread.Sleep(5000);
         return ID+"One";   
    }
}

web服务方法中的对象锁定

不能假设具有相同值的字符串指向相同的内存位置。因此,内存可以包含两个或多个带有"ABC"的实例。那样的话,你的锁就不能用了。

幸运的是,.NET有一个诀窍:string.Intern()。请参阅:http://msdn.microsoft.com/en-us/library/system.string.intern(v=vs.110).aspx

此函数将在某种内部字典中存储或定位字符串。如果这个值是新的,他会把它加到字典里。如果它已经存在,则返回原始值,从而为具有相同值的字符串生成一个地址。

public string AppendOne(string ID)
{
    lock (string.Intern(ID))
    {
         Thread.Sleep(5000);
         return ID+"One";   
    }
}

警告:如果ID为null,您将得到一个异常。你可能想先测试一下。