gpt4 book ai didi

c# - 静态集合的线程安全加载

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:43 25 4
gpt4 key购买 nike

我有一些静态字典对象,其中包含一些常量列表,这样我就不必在每次加载网站时都从数据库中加载它们(例如:国家列表、类别列表)。

所以我有一个静态函数来检查实例是否为空,如果是查询数据库,实例化静态变量,并用数据填充它。

因为它是一个网站,所以可能会有一个以上的人试图在对象为空的情况下同时访问该信息的情况,并且所有这样做的人都会同时调用该过程(这是确实没有必要,会导致对数据库进行不必要的查询,并可能导致列表中出现重复的对象)。

我知道有一种方法可以使这种加载线程安全(只是不太确定如何实现)- 有人可以为我指出正确的方向吗?我应该使用锁吗?

谢谢

更新二:

这是我写的(这是一个很好的线程安全代码吗?)

private static Lazy<List<ICountry>> _countries  = new Lazy<List<ICountry>>(loadCountries);

private static List<ICountry> loadCountries()
{
List<ICountry> result = new List<ICountry>();

DataTable dtCountries = SqlHelper.ExecuteDataTable("stp_Data_Countries_Get");
foreach (DataRow dr in dtCountries.Rows)
{
result.Add(new Country
{
ID = Convert.ToInt32(dr["CountryId"]),
Name = dr["Name"].ToString()
});
}

return result;
}

public static List<ICountry> GetAllCountries()
{
return _countries.Value;
}

最佳答案

您可以使用 Lazy以惰性和线程安全的方式加载资源:

Lazy<List<string>> countries = 
new Lazy<List<string>>(()=> /* get your countries from db */);

更新:

public static class HelperTables
{
private static Lazy<List<ICountry>> _countries;

static HelperTables //Static constructor
{
//Instantiating the lazy object in the static constructor will prevent race conditions
_countries = new Lazy<List<ICountry>>(() =>
{
List<ICountry> result = new List<ICountry>();

DataTable dtCountries = SqlHelper.ExecuteDataTable("stp_Data_Countries_Get");
foreach (DataRow dr in dtCountries.Rows)
{
result.Add(new Country
{
ID = Convert.ToInt32(dr["CountryId"]),
Name = dr["Name"].ToString()
});
}

return result;
});
}

public static List<ICountry> GetAllCountries()
{
return _countries.Value;
}
}

关于c# - 静态集合的线程安全加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20286808/

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