[英]WCF methods sharing a dictionary
我正在创建WCF服务库,并且我对使用该库中的方法使用线程安全性有疑问,这是到目前为止我拥有的完整实现。
namespace WCFConfiguration
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class ConfigurationService : IConfigurationService
{
ConcurrentDictionary<Tuple<string,string>, string> configurationDictionary = new ConcurrentDictionary<Tuple<string,string>, string>();
public void Configuration(IEnumerable<Configuration> configurationSet)
{
Tuple<string, string> lookupStrings;
foreach (var config in configurationSet)
{
lookupStrings = new Tuple<string, string>(config.BoxType, config.Size);
configurationDictionary.TryAdd(lookupStrings, config.RowNumber);
}
}
public void ScanReceived(string boxType, string size, string packerId = null)
{
}
}
}
想象一下,在我的configurationDictionary中有10个值,许多人想查询使用该字典的ScanReceived方法,是否为每个请求ScanReceived的客户端共享了这10个值? 我需要更改我的服务行为吗?
顺便说一下,Configuration方法只能由一个人使用。
使用PerCall
的InstanceContextMode
,每次远程调用进入时,您都应该获得服务的新实例和字典(我假设它将是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(...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.