Я пытаюсь заполнить список из около 3000 слов в раскрывающемся меню формы окна со списком. Это заняло много времени в одном цикле итерации, поэтому я решил использовать многопоточность, чтобы поток выполнял ту же работу с третью списка. Он работает быстрее, но я заметил, что он сильно зависает, когда потоки работают. Я не уверен, что это проблема с блокировкой или просто для заполнения списка элементов со списком требуется много времени.
Я пытался использовать вызывающие методы, но мне кажется, что в этом случае я использую их неправильно.
У меня начались эти темы:
Thread threadmid = new Thread(splitMidThird);
Thread threadtop = new Thread(splitTopThird);
threadmid.Start();
threadtop.Start();
private void splitMidThird()
{
int thirds = totalPartNumber.Count() / 3;
if (PartNumber_Text.InvokeRequired)
{
PartNumber_Text.BeginInvoke(new MethodInvoker(delegate
{
for (int index = thirds; index <= thirds * 2; index++)
{
PartNumber_Text.Items.Add(totalPartNumber.ElementAt(index));
}
}));
}
return;
}
private void splitTopThird()
{
int thirds = totalPartNumber.Count() / 3;
if (PartNumber_Text.InvokeRequired)
{
PartNumber_Text.BeginInvoke(new MethodInvoker(delegate
{
for (int index = thirds * 2; index <= totalPartNumber.Count() - 1; index++I)
{
PartNumber_Text.Items.Add(totalPartNumber.ElementAt(index));
}
}));
}
return;
}
Форма просто зависает, когда я пытаюсь это сделать.
Является ли источник данных таким же, как список элементов со списком? Я не пытаюсь подключиться из базы данных.
Вы пробовали Добавитьдиапазон()? Что-то вроде: PartNumber_Text.Items.AddRange(totalPartNumber.ToArray());
Существует только один поток пользовательского интерфейса, поэтому дополнительные потоки бессмысленны. Когда вы вызываете BeginInvoke, это говорит: «Запустите это в потоке, которому принадлежит элемент управления». Поток, которому принадлежит элемент управления, является единственным потоком пользовательского интерфейса, поэтому ваши потоки просто получают сигнал и запускаются последовательно обратно в основной поток пользовательского интерфейса...
@Idle_Mind Спасибо, что сработало так быстро.





Используйте метод Добавитьдиапазон():
When using this method to add items to the collection, you do not need to call the BeginUpdate and EndUpdate methods to optimize performance.
Что-то типа:
PartNumber_Text.Items.AddRange(totalPartNumber.ToArray());
Вы пробовали простой способ и просто использовали список слов в качестве источника данных?