Многопоточный синглтон в WCF — каково правильное поведение службы?

У меня есть класс (ZogCheckPublisher), который реализует многопоточный одноэлементный шаблон. Этот класс используется в открытом методе (PrintZogChecks) службы WCF, размещенной службой Windows.

public class ProcessKicker : IProcessKicker
{
   public void PrintZogChecks(ZogCheckType checkType)
   {    
       ZogCheckPublisher.Instance.ProcessCheckOrCoupon(checkType);
   }
}

ZogCheckPublisher отслеживает, какой 'checkType' в данный момент находится в процессе печати, и отклоняет запросы, дублирующие текущий активный запрос на печать. Я пытаюсь понять ServiceBehaviors и подходящее поведение для использования. Я думаю, что это уместно:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

Один многопоточный экземпляр службы. Если я правильно понимаю?


person Joe    schedule 17.10.2013    source источник


Ответы (1)


Ваше понимание правильное.

Поведение службы реализует один многопоточный экземпляр службы.

[ServiceBehaviorAttribute(Name = "Test", InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple]

В одноэлементной службе только настроенный режим параллелизма управляет параллельным выполнением ожидающих вызовов. Поэтому, если экземпляр службы настроен с ConcurrencyMode.Multiple, допускается одновременная обработка вызовов от одного и того же клиента. Вызовы будут выполняться экземпляром службы, как только они выходят из канала (вплоть до предела регулирования). Конечно, как всегда в случае с несинхронизированным экземпляром службы с отслеживанием состояния, вы должны синхронизировать доступ к экземпляру службы или рискуете повредить состояние.

Следующие ссылки содержат дополнительные рекомендации по управлению параллелизмом:
Многопоточная одноэлементная служба WCF
http://msdn.microsoft.com/en-us/library/orm-9780596521301-02-08.aspx

С уважением,

person Seymour    schedule 17.10.2013