2017-01-03 7 views
1

Я использую C#, .Net 4.6.x и элементы управления Telerik для WinForms в Visual Studio 2017 RC. Приложение состоит из «основного» окна, которое использует RadRibbon и RadPageView. RadPageView динамически заполняется страницами на основе формы поиска, которая является первой страницей, или пользователем, запрашивающим новую пустую форму. Остальные страницы наследуются от RadPageViewPage и имеют дополнительное свойство, называемое «TQC». TQC относится к настраиваемому элементу управления, который загружается на страницу.Лучший способ разрешить исключение OutOfMemoryException? (C#)

В TQC есть несколько dropdownlists и текстовых областей в RadPageViewPages, которые все содержатся в элементе управления RadPageView внутри объекта TQC. Он не привязывает данные к своим элементам управления, пока не будет выбран его RPVP (класс, наследующий RadPageViewPage). Один из выпадающих списков содержит 200 или около того записей, когда он заполнен (список учетных записей).

Проблема, с которой я столкнулся, заключается в том, что когда внешняя RadPageView Remove() - это страница, память, занимаемая этой страницей, не освобождается, порядка нескольких сотен мегабайт. Это проблематично, так как целевые компьютеры имеют от 4 до 8 ГБ оперативной памяти. Я попытался установить объекты данных, которые заполняют элементы управления до нуля, как часть события закрытия, но ничего не изменилось. Я также попытался явно вызвать метод Dispose() на всех потомков RadPageViewPage, как показано ниже:

private void rpvQtabs_PageRemoved(object sender, RadPageViewEventArgs e) 
    { 

     foreach (TQC c in e.Page.Controls) 
     {     
      foreach (Control ca in c.Controls) 
      { 
       foreach (Control cac in ca.Controls) 
       { 
        cac.Dispose(); 
       } 
       ca.Dispose(); 
      } 
      c.Dispose(); 
     } 
     e.Page.Dispose();   
    } 

Я все еще получаю сумасшедший огромную утечку памяти, и если более 5 вкладок рассматриваются пользователем (даже если они закроют страницу), скоро будет следовать OutOfMemoryException. Я попытался подключить Performance Profiler, но он сработает при попытке. VS 2015 на данный момент не является вариантом. Как я могу обеспечить правильное размещение страниц или уменьшить объем памяти на чрезвычайно больших dropdownlists? Это наш первый набег на использование Telerik.

В ответ на вопросы в комментариях:

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

public static List<Account> List(bool includeDefaults = true) 
    { 
     //search 
     var rs = new List<Account>(); 
     string q = "select distinct r.ID, r.name from db.addressbook r"; 
     DataTable dt = new DataTable(); 
     using (var cmd = new CustomConnectionClass()) 
     { 
      cmd.Safety.Off(); 
      dt = cmd.ExecuteDirectQuery(q); 
     } 

     foreach (DataRow r in dt.Rows) 
     { 
      var a = new Account(); 
      a.ID = long.Parse(r[0].ToString()); 
      a.Name = r[1].ToString(); 
      rs.Add(a); 
     } 
     rs = rs.OrderBy(t => t.ID).ToList(); 
     var n = new Account(); 
     n.ID = 0; 
     n.Name = "Generic Account"; 
     var o = new Account(); 
     o.ID = 999999; 
     o.Name = n.Name; 
     rs.InsertRange(0, new Account[] { n, o }); 
     return rs; 

    } 
+0

Сколько у вас предметов в DropDownList? Какой предмет? Объект complexe или просто значение id +? –

+0

Он связан с IEnumerable . Он содержит 16 свойств, большинство из которых не загружаются при создании списка. Фактически, только два заполненных номера - это идентификационный номер и имя, которые объединены, чтобы сделать отображаемый текст в раскрывающемся списке с помощью метода ToString(). IEnumerable фактически создается, когда приложение загружается как часть основной формы, но к нему обращаются дочерние объекты для привязки к этим элементам управления. – CDove

+0

Я только что загрузил DropDownList с 100000 строк Datatable без каких-либо проблем. Datatable содержит 9 колонок, все установлены. Таким образом, свойства 200Entry * 16 не должны быть проблемой. –

ответ

0

После дальнейших исследований, я был в состоянии разобраться, что это связано как Telerik загружает свои темы и элементы управления. Создание всех источников данных для dropdownlists static немного уменьшило площадь, но список участников и темы для элементов управления на каждой вкладке были загружены как новые каждый раз. По конструкции они не обязательно расположены, когда контроль закрыт и расположен. Дизайн пользовательского интерфейса должен быть переработан для предотвращения нехватки памяти у пользователей. Проблема исчезает, если один и тот же дизайн включен с использованием стандартных WinForms.

+0

Вы должны сделать сообщение об ошибке для telerik об этом. Вы можете выиграть хорошую скидку на свою следующую лицензию. –