2012-03-12 3 views
2

아래에서는 WCF 서비스/클라이언트 설정에 대해 설명했습니다. 단일 클라이언트가 IWCFService.Process를 연속적으로 여러 번 호출하면 WCFService.Process와 this.Subscribers.ProcessingCompleted를 실행하는 WCFService.Run의 라인 사이에 서비스 교착 상태가 발생합니다.WCF 서비스가 교착 상태입니다.

클래스 WCFService의 인스턴스가 ServiceHost 생성자에 전달되고 WCFService의 실행 API가 QueueUserWorkItem을 사용하여 생성 된 스레드에서 다시 호출됩니다. WCF가 WCFService.Process로 호출하는 데 사용하는 스레드와 WCFService.Run 스레드가 실행중인 스레드간에 충돌이 발생했다고 추측합니다.

이미 1000 MaxConcurrentSessions 및 1000 MaxConcurrentCalls를 허용하는 ServiceThrottlingBehavior를 추가했습니다. 이 교착 상태를 막을 서비스 또는 클라이언트 클래스에 속성을 추가 할 수 있습니까?

[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 
    } 
} 

답변

1

서버가 스레드로부터 안전하지 않습니다.

InstanceContextMode = InstanceContextMode.Single은 WCF가 멀티 스레드 액세스를 적절하게 방지하지만 백그라운드에서 스레드 풀을 사용하더라도 동일한 제한이 적용되지 않음을 의미합니다.

서버를 스레드로부터 안전하게 만들거나 스레드 풀을 사용하지 않아야합니다.

여기에 좋은 introductory article on multi-threading입니다.

+0

각 메소드를 잠금 (this)으로 래핑한다고 가정하고 실행하지 못했지만 다음 속성을 사용하려고 시도했지만 작동하지 않았습니다. \t \t [MethodImpl (MethodImplOptions.Synchronized)] – user481779

+0

스레드 풀을 사용할 때 문제가 발생하므로이 문제를 해결할 수있는 특성을 찾을 수 없습니다. –

+0

실행 상단에 자물쇠를 넣고 처리하면 여전히 교착 상태가 발생합니다. 여기에 문제가되는 스레드 풀을 사용하는 것이 확실하지 않습니다. – user481779

관련 문제