Я подозреваю, что ваша проблема в том, что вы сообщаете о прогрессе слишком часто. Если работа, которую вы выполняете между вызовами Report
, тривиальна (например, чтение только одной строки из файла), то отправка операций в поток пользовательского интерфейса станет вашим узким местом. Ваша очередь диспетчера пользовательского интерфейса затопляется, и она не поспевает за новыми событиями, такими как реагирование на щелчки или движения мыши.
Чтобы уменьшить это, вы должны уменьшить частоту ваших Report
вызовов до разумного уровня - например, вызывать его только тогда, когда обрабатывается партия из 1000 строк.
int i = 0;
foreach (string line in System.IO.File.ReadLines(file, Encoding.UTF8))
{
if (++i % 1000 == 0)
progress.Report(1000);
}
В ответ на комментарии: Размер файла не имеет значения при выборе размера пакета. Скорее: найдите разумную цель для частоты обновления - скажем, 100 мс. Измерьте или оцените время, необходимое для чтения и обработки одной строки - например, 100 мкс. Разделите первое на второе, и вы получите ответ. Мы выбрали 1000, потому что, по нашим оценкам, для 1000 строк потребуется 100 мс. Оптимальная частота обновления составляет около 10–100 мс, что является пределом человеческого восприятия; ничего более частого, чем это, не будет замечено пользователем.
В соответствии с вышесказанным, ваши файлы из 10 и 500 строк не должны выпускать никаких обновлений в пользовательском интерфейсе, потому что они были бы обработаны полностью за считанные миллисекунды, прежде чем пользователь сможет наблюдать за любым прогрессом. Файл с 1 000 000 строк в общей сложности займет около 100 секунд, и в течение этого периода пользовательский интерфейс будет обновляться 1000 раз (один раз каждые 100 мс).