2011-01-13 3 views
3

У меня есть статический класс, который я использую в качестве своего слоя данных на своем веб-сайте. В этом классе у меня есть строковые массивы, в которых хранятся запрошенные данные, к которым я могу получить доступ позже. Вот часть моего класса и рассмотренный метод:освобождение памяти, статический класс деструктора?

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). Почему эта память не освобождается при завершении программы (выход из браузера или остановка режима отладки)? Есть ли способ вручную освободить эту память и создать дескриптор для статического класса?

+1

, кстати, этот код полностью небезопасен (статические методы обычно должны быть потокобезопасными), а данные немного рискуют быть мутированными случайно, возвращая «предметы» из класса –

+0

Я ничего не знаю о нарезке, действительно. Недавний град, и никогда не упоминал многопоточность в 4 года программирования майора .. uber безумный об этом –

+0

@Nicklamort - вы пишете ** веб-приложение **, верно? Ну, веб-серверы запускают несколько потоков. Поэтому, если у вас только 1 пользователь, и они обещают только загрузить одну страницу за раз, вы должны ** действительно ** думать о безопасности потоков. –

ответ

7

Нет, нет такого понятия, как деструктор для статического класса, но вы можете сделать что-то вроде:

public static void Unload() { 
    items = description = null; 
} 

Re «Почему эта память не получает освобожден, когда программа заканчивается» - если вы имеете в виду выйдя из браузера, сервер даже этого не заметит. Он будет очищен, когда приложение (в IIS) умрет.

+0

О, я вижу. Я решил, что когда вы выйдете или уйдете от сайта, сервер завершит это приложение и освободит всю память для этого пользователя. Спасибо, зная, что мне не помогло бы написать мой код :) ps-btw, я предполагаю, что мне пришлось бы вызывать Unload() самостоятельно, это не было бы автоматическим, как деструктор? –

+0

@Nicklamort - имейте в виду, что ** все ** ваши пользователи используют ** то же ** статические данные. Выгрузка его для пользователя A также выгружает его для пользователя B и все 14 вкладок в 3 браузерах пользователем C –

+0

Marc, если мои данные не будут очищены до того, как будет удален app-pool, можно было бы ввести новую запись в базу данных, и пользователь попытается перезагрузить страницу, загрузив новый массив в мои уже определенные массивы и выбросив ошибку? если да, то установит ли он значение null, позволяющее перераспределить? –

2

Это потому, что поля являются статическими и прекращение отладки не означает, что сервер WebDev закрыт. Если вы хотите сохранить строки для каждого пользователя, поместите их в объект сеанса. Он гарантирует, что они будут доступны для каждого пользователя и будут забыты после завершения сеанса (тайм-аут или закрытие окна браузера).

Смежные вопросы