С InstanceContextMode
из PerCall
вы должны получать новый экземпляр вашей службы и ваш словарь каждый раз, когда поступает удаленный вызов (который, я предполагаю, будет либо Configuration()
, либо ScanReceived()
).Это не будет разделять configurationDictionary
между несколькими клиентами.
С ConcurrencyMode
из Single
у вас когда-либо будет только один поток, выполняющий ваш код в любой момент времени.Так что любые проблемы параллелизма спорны.
Два способа поделиться configurationDictionary
:
- Сделать это статичным:
private readonly static ConcurrentDictionary<...> ...
- Изменить свой
InstanceContextMode
,и, возможно, ваш ConcurrencyMode
.
Я бы порекомендовал первый вариант, если вы не ожидаете тысячи вызовов в службу в секунду.
MSDN имеет некоторую информацию о InstanceContextMode и создание классов обслуживания.
Если вы переключитесь на InstanceContextMode.Single
и ConcurrencyMode.Multiple
, вы можете получить множество потоков, выполняющихся одновременно, и вам потребуетсябеспокоиться о синхронизированном доступе.
Главное, на что нужно обратить внимание, это то, что, когда вы запрашиваете / просматриваете свой словарь, кто-то другой может изменить его.Получение снимка словаря и последующий запрос снимка должны обойти эту проблему:
foreach (var x in configurationDictionary.ToArray())
{
....
}
Или, если вы используете LINQ:
var someResult = configurationDictionary.ToArray().Where(...).Select(...)