Я использую 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;
}
Сколько у вас предметов в DropDownList? Какой предмет? Объект complexe или просто значение id +? –
Он связан с IEnumerable. Он содержит 16 свойств, большинство из которых не загружаются при создании списка. Фактически, только два заполненных номера - это идентификационный номер и имя, которые объединены, чтобы сделать отображаемый текст в раскрывающемся списке с помощью метода ToString(). IEnumerable фактически создается, когда приложение загружается как часть основной формы, но к нему обращаются дочерние объекты для привязки к этим элементам управления. –
CDove
Я только что загрузил DropDownList с 100000 строк Datatable без каких-либо проблем. Datatable содержит 9 колонок, все установлены. Таким образом, свойства 200Entry * 16 не должны быть проблемой. –