gpt4 book ai didi

.net - 以相同的方法写入两个 .net 字典时的线程安全

转载 作者:行者123 更新时间:2023-12-03 12:57:03 25 4
gpt4 key购买 nike

我被要求在类线程中制作字典安全。

我的第一个建议是实现一个线程安全的字典,.net 开发者社区已经在努力,但被拒绝了。

代码是这样的:

class Example()
{
Dictionary<string, string> dic1;
Dictionary<string, string> dic2;
public void Example()
{
dic1 = new Dictionary<string,string>(10);
dic2 = new Dictionary<string,string>(10);
}

public string Method1(string param1)
{
if(dic1.ContainsKey(param1))
{
return dic1[param1];
}

if(IsValidParam(param1))
{
dic1.Add(param1, param1);
return param1;
}

try
{
var params = GetValidParams(param1);
if(params.Count > 0)
{
foreach(var param in params)
{
if(!isValirParam(param)
continue;

dic1.Add(param1, param);

if(!dic2.ContainsKey(param1))
{
dic2.Add(param, param1);
}

return param;
}
}
else
{
dic2.Add(param1, param1);
return param1;
}
}
catch(Exception ex)
{
.....
}

return param1;
}
}

这只是对同一方法内的两个字典具有读写访问权限的众多方法之一。

我正在考虑重构并在每个 Add 和 return 中使用“ReaderWriterLockSlim”,但我不知道这是否会使该线程安全。

你知道如何解决这个问题吗?我愿意接受建议...

在此先感谢您的时间

最佳答案

在这种情况下,确保获得预期结果的最简单方法是使用 lock .

class Example()
{
Dictionary<string, string> dic1;
Dictionary<string, string> dic2;
private Object syncRoot;
public void Example()
{
dic1 = new Dictionary<string,string>(10);
dic2 = new Dictionary<string,string>(10);
syncRoot = new Object();
}

public string Method1(string param1)
{
lock(syncRoot) {
if(dic1.ContainsKey(param1))
{
return dic1[param1];
}

if(IsValidParam(param1))
{
dic1.Add(param1, param1);
return param1;
}

try
{
var params = GetValidParams(param1);
if(params.Count > 0)
{
foreach(var param in params)
{
if(!isValirParam(param)
continue;

dic1.Add(param1, param);

if(!dic2.ContainsKey(param1))
{
dic2.Add(param, param1);
}

return param;
}
}
else
{
dic2.Add(param1, param1);
return param1;
}
}
catch(Exception ex)
{
.....
}

return param1;
}
}
}

请注意,这会使事情变慢(锁定有一些开销,特别是您不会有两个线程同时执行锁定块内的任何内容),但它确保运行此方法的 Thread2 无法更改在 Thread1 测试一个值和它尝试使用该测试的结果来做某事之间。它也不需要 .net 4,因此您将能够使用它。

编辑 - 还值得一提的是,如果您有任何其他方法可以修改任一字典,您将希望以相同的方式锁定它们。这里的关键是在任何给定的时刻只有一个线程可以处理东西。

关于.net - 以相同的方法写入两个 .net 字典时的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7180045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com