Ниже я изложил настройки службы / клиента WCF. Когда один клиент вызывает IWCFService.Process несколько раз подряд, служба блокируется между WCFService.Process и строкой в WCFService.Run, которая выполняет this.Subscribeers.ProcessingCompleted.
Экземпляр класса WCFService передается в конструктор ServiceHost, а API-интерфейс Run WCFService вызывается из потока, созданного с использованием QueueUserWorkItem. Я предполагаю, что конфликт возникает между потоком, который 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
}
}