아래에서는 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
}
}
각 메소드를 잠금 (this)으로 래핑한다고 가정하고 실행하지 못했지만 다음 속성을 사용하려고 시도했지만 작동하지 않았습니다. \t \t [MethodImpl (MethodImplOptions.Synchronized)] – user481779
스레드 풀을 사용할 때 문제가 발생하므로이 문제를 해결할 수있는 특성을 찾을 수 없습니다. –
실행 상단에 자물쇠를 넣고 처리하면 여전히 교착 상태가 발생합니다. 여기에 문제가되는 스레드 풀을 사용하는 것이 확실하지 않습니다. – user481779