2013-05-20 3 views
1

Я использую в .Список Коробка после добавления нескольких записей

Я упростил свое приложение, так что у него есть только ListBox и Button.

Вот мой щелчок кнопки событие:

private void button1_Click(object sender, EventArgs e) 
{ 
    for (long i = 0; i < 66000; i++) 
    { 
     listBox1.Items.Add(i.ToString()); 
     listBox1.SelectedIndex = listBox1.Items.Count - 1; 
    } 
} 

Когда я запускаю мое приложение и нажать на кнопку Я вижу ListBox обновление и через некоторое время (оно изменяется запись 3041 или около того) программа будет зависнуть поскольку он добавляет остальную часть записей после ее завершения, ListBox будет соответствующим образом обновляться.

Почему висит? Слишком много, чтобы справиться? Я посмотрел на свое использование процессора, и память, похоже, не так сильно использовалась, поэтому я не уверен, в чем проблема.

+1

Зачем вам даже в 66 000 товаров в список? – Svexo

+0

Мне действительно не нужно, чтобы многие использовали его для проверки проблемы, которую я имел в более крупном приложении. Я выбираю 66 000, потому что я видел другой вопрос, который имеет проблемы, когда в списке имеется более 65535 элементов, проблема возникает до того, как она попадет на это множество предметов. – hrh

+1

Да, ты его переполнил. ListBoxes действительно не нравится, что вы это делаете. Если вам действительно нужно добавить загрузку элементов в ListBox, используйте ['ListBox.Items.AddRange()'] (http://msdn.microsoft.com/en-us/library/system.windows.forms .listbox.objectcollection.addrange.aspx) или вызовите ['ListBox.BeginUpdate()'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.beginupdate.aspx) перед добавив элементы и ['ListBox.EndUpdate()'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.endupdate.aspx). –

ответ

2

Вы неверно истолковываете, что происходит. Ваш список будет заморожен через 5 секунд. Вот когда Windows заходит, когда замечает, что вы не заботитесь о нормальных обязанностях потока пользовательского интерфейса. Ваше окно заменило так называемым «призрачным окном», чтобы сообщить пользователю, что вы ушли кататоническим, и что делать такие вещи, как нажатие кнопки «Закрыть», не будет иметь никакого эффекта.

Самый простой способ сказать, что вы получили окно-призрак, находится в строке заголовка, в нем говорится: «Не реагировать».

версия этого, что будет жить несколько лучше:

private void button1_Click(object sender, EventArgs e) { 
     listBox1.BeginUpdate(); 
     for (long i = 0; i < 66000; i++) { 
      listBox1.Items.Add(i.ToString()); 
     } 
     listBox1.EndUpdate(); 
     listBox1.SelectedIndex = listBox1.Items.Count - 1; 
    } 

Вы не должны ожидать, в противном случае окна, чтобы вести себя разумно, когда вы делаете неразумные вещи. И вы не должны ожидать, что пользователи будут вести себя разумно, когда они столкнутся с этой катастрофой пользовательского интерфейса. Но они дадут вам знать сами.

+0

Спасибо, цикл for был всего лишь тестовым примером того, что я испытывал в своем более крупном приложении, в моем более крупном приложении его несколько сложнее, чем добавление нескольких строк сразу, но они довольно часто добавляются по мере завершения задач, я буду однако попробуйте «Начать и завершить обновление». знак равно – hrh

2

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

Добавьте к этому тот факт, что вы, вероятно, используете только один поток в этом приложении (вы не используете рабочий рабочий поток для обновления списка, верно?), И вы видите, почему ваше приложение зависает. Формы Windows всегда занимают некоторое время, когда им нужно обновлять свои элементы управления ... Это просто для обычного, повседневного использования, они требуют обновления milisseconds. Для тайного использования, такого как список, содержащий более нескольких сотен элементов в графическом интерфейсе, для обновления требуется несколько секунд или минут, и вы будете воспринимать это как зависание. Поместите обработку элемента в другой поток, и вы увидите, что форма будет быстро обновлять графический интерфейс, но между обновлениями потребуется много времени.

+0

Разве я не увижу, что память будет израсходована в Мониторе ресурсов? Кажется, он не израсходовался. – hrh

+0

Если вы освободите 10 мб и выделите 10 МБ и 1 байт, вы не увидите больших изменений на мониторе. – Renan

+1

Можете ли вы обновить фоном, хотя это потокобезопасно? – Svexo

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