У меня есть статический класс, который я использую в качестве своего слоя данных на своем веб-сайте. В этом классе у меня есть строковые массивы, в которых хранятся запрошенные данные, к которым я могу получить доступ позже. Вот часть моего класса и рассмотренный метод:освобождение памяти, статический класс деструктора?
public static class data_layer
{
private static string[] items;
private static string[] description;
//will return description for an item id. if no item id is found, null is returned
public static string getDesc(string key)
{
int i = 0;
bool flag = false;
//search for the item id to find its index
for(i = 0; i < items.Length; i++)
{
if(items[i] == key)
{
flag = true;
break;
}
}
if(flag)
return description[i];
else
return null;
}
public static string[] getItems()
{
return items;
}
public static bool setItemsAndDescriptions()
{
ArrayList itemIDs = new ArrayList();
ArrayList itemDescs = new ArrayList();
SqlConnection sqlConn = new SqlConnection();
sqlConn.ConnectionString = ConfigurationManager.ConnectionStrings["MAS200RAWConnectionString"].ConnectionString;
string query = "SELECT ItemNumber, ItemDescription FROM OUS_IM1_InventoryMasterfile " +
"WHERE ItemNumber LIKE 'E%' OR ItemNumber LIKE 'B%' OR ItemNumber LIKE 'D%'";
try
{
sqlConn.Open();
SqlCommand sqlComm = new SqlCommand();
sqlComm.Connection = sqlConn;
sqlComm.CommandType = CommandType.Text;
sqlComm.CommandText = query;
SqlDataReader reader = sqlComm.ExecuteReader();
if (reader == null)
return false;
//add the queried items to the ddl
while (reader.Read())
{
itemIDs.Add(reader["ItemNumber"].ToString().Trim());
itemDescs.Add(reader["ItemDescription"].ToString().Trim());
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
sqlConn.Close(); //NOTE: I HAVE A BREAKPOINT HERE FOR DUBUGGING
}
items = itemIDs.ToArray(typeof(string)) as string[];
description = itemDescs.ToArray(typeof(string)) as string[];
return true;
}
}
Это все работает отлично, но, поставив точку останова, где я сказал, что я положил его, я заметил, что члены класса пункты и описания сохраняют свою выделенную память и элементы между выполнением моей программы (локальный сервер asp dev). Почему эта память не освобождается при завершении программы (выход из браузера или остановка режима отладки)? Есть ли способ вручную освободить эту память и создать дескриптор для статического класса?
, кстати, этот код полностью небезопасен (статические методы обычно должны быть потокобезопасными), а данные немного рискуют быть мутированными случайно, возвращая «предметы» из класса –
Я ничего не знаю о нарезке, действительно. Недавний град, и никогда не упоминал многопоточность в 4 года программирования майора .. uber безумный об этом –
@Nicklamort - вы пишете ** веб-приложение **, верно? Ну, веб-серверы запускают несколько потоков. Поэтому, если у вас только 1 пользователь, и они обещают только загрузить одну страницу за раз, вы должны ** действительно ** думать о безопасности потоков. –