Не обновляйте событие reportprogress в каждой строке цикла.
Вместо этого вызывайте ReportProgress каждые 2 и более итераций (лучший способ - вычислить и шаг, чтобы не обновлять каждую строку, если у вас есть 200000)
И заполните сетку, когда весь процесс завершится (в завершенном событии), чтобы обновить все строки. Я думаю, что прогресс предназначен для обновления только прогресса, а не для заполнения группы данных в элементе управления, но я могу ошибаться:
от здесь :
Советы Вы, вероятно, знаете больше, чем думаете о BackgroundWorker
учебный класс. У BackgroundWorker есть имя, которое может указывать, что оно более
сложнее, чем на самом деле. Есть еще много деталей о потоках
и прервать вызовы, но как только вы поймете, что BackgroundWorker просто
структурное «наложение» на потоки в Windows Forms, это вполне
интуитивный. Вот снова шаги:
Сначала вызовите RunWorkerAsync с аргументом. Вы можете передать любой аргумент
к этому методу на BackgroundWorker, в том числе ноль. Это просто должно
наследовать от объекта, который все делает.
Во-вторых, выполняется пользовательская обработка. Ваш дорогой код выполняется в
метод DoWork. Вставьте паузу здесь, так как ваша программа делает это
расчеты.
В-третьих, это заканчивается. Когда ваша обработка закончится, RunWorkerCompleted
называется. В этом методе вы получите результат. Таким образом, ваш
Объект BackgroundWorker изменяет объект в другом потоке, и вы
получите это, когда это будет сделано.
Я думаю, что он зависает, когда требуется слишком много обновлений за короткое время, и даже вызов Apllication.DoEvents () не работает все время.
Я надеюсь, что это поможет, немного поздно, я знаю, но это лучше, чем никогда;)