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方法只能被一个人使用。
使用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(...)