Я использую следующий класс для обеспечения доступа к языковым ресурсам в приложении asp.net. Я выношу страницу для выбранного языка, получая текстовые значения из базы данных. поэтому я пытаюсь оптимизировать выборку текстов, кэшируя их в статическом datatable. Тем не менее, я не уверен, всегда ли он безопасен для чтения из tableResources, который может быть воссоздан функцией UpdateResources. Я знаю, что GC не выпустит объект, когда его прочитает Rows.Find, но я мало знаю о GC. Это может вызвать тупик или застревание GC, что бы то ни было. (Я думаю, что инструкции IL не являются атомарными, если только те, которые были скомпилированы для одной команды CPU). Пожалуйста, помогите мне понять это.доступ к удаленному объекту
public class Resources
{
public static DataTable tableResources;
public static object objSync = new object();
private PageLangs PageLang;
static Resources()
{
UpdateResources();
}
public Resources(PageLangs pageLang)
{
PageLang = pageLang;
}
public static void UpdateResources()
{
OleDbConnection con = ProjectLib.CreateDBConnection();
try
{
con.Open();
OleDbDataAdapter adap = new OleDbDataAdapter("SELECT Resource0,Resource1,Resource2,Resource3,Resource4,Resource5,Resource6,ResourceCode FROM Resources", con);
DataTable dt = new DataTable();
adap.Fill(dt);
adap.Dispose();
dt.PrimaryKey = new DataColumn[] { dt.Columns["ResourceCode"] };
// DataTable is thread-safe for multiple reads but not for writes so sync. it.
lock (objSync)
{
tableResources = dt;
}
}
catch
{
}
finally
{
ProjectLib.CloseDBConnection(con);
}
}
public string this[string resourceCode]
{
get
{
try
{
DataRow row = tableResources.Rows.Find(resourceCode);
if (row != null)
return row[(int)PageLang] as string;
else
return resourceCode;
}
catch
{
return null;
}
}
}
}
Начните с объяснения того, чего вы пытаетесь достичь. – RichardOD
Извините, я забыл упомянуть, что я использую этот класс в приложении asp.net. Я выношу страницу для выбранного языка, получая текстовые значения из базы данных. поэтому я пытаюсь оптимизировать выборку текстов, кэшируя их в статическом datatable. – marksxer
Я просто считаю, что было бы лучше выпустить адаптеры Fill() на таблицу без повторного создания, потому что Fill обновляет измененные строки из базы данных. Но я не уверен, что он просто обновляет существующие без повторного их создания. – marksxer