WCF服务完全锁定

时间:2011-04-01 19:01:43

标签: c# wcf deadlock

我有一个像这样配置的WCF服务:

InstanceContextMode = InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple

我有一种方法,我每秒呼叫服务大约十次,持续约30秒。随机地,服务停止工作,客户端在调用服务的行上停止。

在服务器端,我有一个静态对象“MyStaticObject”(我的服务中没有声明,这是服务器上的另一个类)。这个对象是一个Dictionnary,它包含一些实例对象,其中有一个backgroundworker。

我认为数据库中没有死锁,因为它在我尝试访问服务时锁定,而不是在我尝试访问数据库时锁定。

我目前以这种方式锁定我的词典:

lock (MyClass.MyStaticLockObject)
{
    MyClass.MyStaticObject...;
}

我想知道什么可能导致这种奇怪的行为。

1 个答案:

答案 0 :(得分:2)

如果您在客户端为每个操作创建一个新的代理对象,我已经看到WCF服务在高负载下锁定。您确定每秒不创建10个代理实例吗?

如果您正在访问Dictionary的静态实例,则可能需要考虑在执行读/写操作时将其锁定,例如:

lock (MyStaticObject)
     MyStaticObject.Add("Foo", foo);

lock (MyStaticObject)
     foo = MyStaticObject["Foo"];

或者,您可以尝试使用Dictionary的线程安全实现,例如this article中的一个,它使用ReaderWriterLockSlim来维护用于读写的单独锁。

BTW:对于那些不可思议的服务每秒被调用10次的人来说,我目前正在开展一个项目,它每秒可以完成100次调用 - 并且必须在部署的地方进行。