2011-04-01 165 views
1

我有配置这样的WCF服务:WCF服务完全锁定

InstanceContextMode = InstanceContextMode.PerCall, 
ConcurrencyMode = ConcurrencyMode.Multiple 

我在哪里调用服务大约每秒十次约30秒的方法。随机地,服务停止工作,客户端停止在调用该服务的线路上。

在服务器端,我有一个静态对象“MyStaticObject”(未在我的服务中声明,这是服务器上的其他类)。该对象是一个包含一些实例化对象的词典,其中有一个背景工作者。

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

目前我锁我dictionnary这样:

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

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

+0

在半分钟内300次?为什么??? – Patrick 2011-04-01 19:04:27

+0

是否从多个线程访问“MyStaticObject”? – 2011-04-01 19:06:23

+0

@帕特里克:推测是负载测试。如果这是网络服务的一部分,如果知道它可以采取惩罚,那将是很好的。 – 2011-04-01 19:07:07

回答

2

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

如果您正在访问词典的静态实例,你可能要考虑锁定它,当你这样做的读/写操作,例如:

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

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

或者,你可以尝试使用一个线程安全字典的实现,如this article中的字典,它使用ReaderWriterLockSlim维护用于读写的单独锁。顺便说一句:对于那些不敢相信服务将被称为每秒10次的项目,我目前正在开展一个项目,该项目每秒可以完成100次呼叫 - 而且不得不将其部署到哪里。

+0

谢谢你的回复。我锁定了我的MyStaticObject,请看我的第一篇文章,看看我是如何进行的。每次我打电话给服务时,我都没有创建代理,我只打开一次,直到应用程序关闭才打开。 – 2011-04-01 19:37:01