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正确地阻止了多线程访问,但是您在幕后使用线程池不受同样的限制。

您需要使服务器线程安全或不使用线程池。

这是一个很好的introductory article on multi-threading

+0

我试着在Run和Process上使用下面的属性,假设它将每个方法都封装在一个锁(this)中,但它也不起作用。 \t \t [MethodImpl(MethodImplOptions.Synchronized)] – user481779 2012-03-12 21:49:05

+0

您不会找到任何可以解决此问题的属性,因为您使用线程池时会出现问题。 – 2012-03-12 22:09:54

+0

如果我在Run和Process的顶部插入一个锁(this),它仍然是死锁。我不确定这只是我在这里讨论的线程池的使用。 – user481779 2012-03-13 02:04:00