我的团队目前正在讨论这个问题.
有问题的代码就是这样的
if (!myDictionary.ContainsKey(key))
{
lock (_SyncObject)
{
if (!myDictionary.ContainsKey(key))
{
myDictionary.Add(key,value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我见过的一些帖子说这可能是一个很大的NO NO(当使用TryGetValue时).然而,我们团队的成员说没关系,因为"ContainsKey"不会对密钥集合进行迭代,而是通过O(1)中的哈希代码检查密钥是否包含在内.因此他们声称这里没有危险.
我想就此问题得到您的诚实意见.
c# collections multithreading dictionary double-checked-locking
因此,我们正在努力添加 SQL DACPAC 作为我们持续集成的一部分。我们使用运行“sqlpackage.exe”和每个 DacPac 文件的 powershell 脚本来做到这一点。我们有大约 12 个 DB,因此大约有 12 个 DacPac。
每次我们运行“sqlpackage.exe”来发布或编写 DacPac 脚本时,我们都会注意到完成初始化需要 0.5-1 分钟以上的时间。当“sqlpackage.exe”开始时,大部分时间是在初始化流程中花费的。
如果可能的话,我试图找到一种方法来减少这种情况,因为我们有 12 个数据库,我们正在谈论数据库部署至少需要 12 分钟,这对我们来说太多了。
你知道有什么方法可以减少这种情况吗?
作为团结基本演示的一部分,我创建了以下控制台应用程序(有点冗长):
IUnityContainer container = new UnityContainer();
container.RegisterType<ISimpleClass, SimpleClass>();
container.RegisterType<ISingletonWithUnity, SingletonWithUnity>(new ContainerControlledLifetimeManager());
double N = 10000;
double sum = 0;
Console.WriteLine("Testing performace of a basic new object");
for (int i = 0; i < N; i++)
{
DateTime start = DateTime.Now;
ISimpleClass simpleClass = new SimpleClass();
DateTime end = DateTime.Now;
sum += (end - start).Milliseconds;
}
double average = sum/N;
Console.WriteLine("Average time for basic new object is: " + average);
Console.WriteLine("Testing performance of transient resolve using unity");
sum = 0;
for …Run Code Online (Sandbox Code Playgroud)