WCF服务正在死锁
问题描述:
下面,我概述了我的WCF服务/客户端设置。当一个客户端连续多次调用IWCFService.Process时,WCFService.Process和WCFService.Run中执行this.Subscribers.ProcessingCompleted的行之间的服务会死锁。WCF服务正在死锁
将类WCFService的一个实例传递到ServiceHost构造函数中,并且使用QueueUserWorkItem创建的线程回调WCFService的运行API。我猜测冲突起源于WCF用来调用WCFService.Process和线程WCFService.Run正在运行的线程之间。
我已经添加了ServiceThrottlingBehavior以允许1000个MaxConcurrentSessions和1000个MaxConcurrentCalls。我可以在防止这种死锁的服务或客户端类上添加属性吗?
[ServiceContract(Name = "IWCFClient")]
public interface IWCFClient
{
[OperationContract]
void ProcessingCompleted(Guid guid);
}
[ServiceContract(Name = "IWCFService", CallbackContract = typeof(IWCFClient))]
public interface IWCFService
{
[OperationContract]
Guid Process(string filename);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class WCFService : IWCFService, WFGenericThread<WFProcessingResult>,
{
public Dictionary<Guid, IWCFClient> Subscribers { get; set; }
public override void Run(WFProcessingResult queueobj)
{
if(this.Subscribers.ContainsKey(queueobj.Guid))
this.Subscribers.ProcessingCompleted(queueobj.Guid);
}
public Guid Process(string filename)
{
Subscribers.Add(guid, (IWCFClient)OperationContext.Current.GetCallbackChannel<IWCFClient>());
// send filename off to be processed
}
}
答
您的服务器不是线程安全的。
InstanceContextMode = InstanceContextMode.Single
表示WCF正确地阻止了多线程访问,但是您在幕后使用线程池不受同样的限制。
您需要使服务器线程安全或不使用线程池。
我试着在Run和Process上使用下面的属性,假设它将每个方法都封装在一个锁(this)中,但它也不起作用。 \t \t [MethodImpl(MethodImplOptions.Synchronized)] – user481779 2012-03-12 21:49:05
您不会找到任何可以解决此问题的属性,因为您使用线程池时会出现问题。 – 2012-03-12 22:09:54
如果我在Run和Process的顶部插入一个锁(this),它仍然是死锁。我不确定这只是我在这里讨论的线程池的使用。 – user481779 2012-03-13 02:04:00