WCF方法共享一个字典

本文关键字:一个 字典 方法 共享 WCF | 更新日期: 2023-09-27 18:11:42

我正在创建一个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方法查询这个字典,这10个值是否为请求ScanReceived的每个客户端共享?我需要改变我的ServiceBehavior吗?

Configuration方法只能被一个人使用。

WCF方法共享一个字典

使用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(...)