繁体   English   中英

共享字典的WCF方法

[英]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方法只能由一个人使用。

使用PerCallInstanceContextMode ,每次远程调用进入时,您都应该获得服务的新实例和字典(我假设它将是Configuration()ScanReceived() )。 这不会在多个客户端之间共享configurationDictionary

ConcurrencyModeSingle您一次只能运行一个线程来运行代码。 因此,任何并发问题都没有意义。

共享configurationDictionary两种方法:

  1. 将其设为静态: private readonly static ConcurrentDictionary<...> ...
  2. 更改您的InstanceContextMode ,并可能更改您的ConcurrencyMode

如果您不希望每秒收到数千次服务呼叫,我建议您使用第一种方法。

MSDN具有有关InstanceContextMode和服务类实例化的一些信息。


如果更改为InstanceContextMode.SingleConcurrencyMode.Multiple ,则可以一次执行多个线程,您将需要担心同步访问。

要注意的主要事情是,当您查询/迭代字典时,其他人可能会对其进行修改。 抓住字典的快照,然后查询快照应该可以解决该问题:

foreach (var x in configurationDictionary.ToArray())
{
     ....
}

或者,如果您使用的是LINQ:

var someResult = configurationDictionary.ToArray().Where(...).Select(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM