【发布时间】:2013-12-15 17:05:29
【问题描述】:
我有一些静态 Dictionary 对象,其中包含一些常量列表,因此我不必在每次加载网站时都从数据库加载它们(例如:国家列表、类别列表)。
所以我有一个静态函数来检查实例是否为空,如果是查询数据库,则实例化静态变量,然后用数据填充它。
由于它是一个网站,可能会出现这样一种情况,即当对象为空时,不止一个人试图同时访问该信息,并且所有这样做的人都会同时调用该过程(即真的没有必要,导致对数据库的不需要的查询,并可能导致列表中的重复对象)。
我知道有一种方法可以使这种加载线程安全(只是不太确定如何) - 有人能指出我正确的方向吗?我应该使用锁吗?
谢谢
更新二:
这是我写的(这是一个好的线程安全代码吗?)
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 对象存储并始终重新抛出。然后,应用程序将被冲洗,直到它重新启动。
标签: c# asp.net thread-safety