Ваш код выполняет очень узкий цикл и в его центре он вызывает ReportProgress ().
Это означает, что ваше MessageQueue заполнено запросами на выполнение обновлений Progress.
Если вы добавите некоторую задержку (Thread.Sleep (100)) в поток Bgw, вы увидите, что отзывчивость улучшится.
Более практичным решением является перемещение отчетности во внешний цикл. В вашем случае:
for (int i = 1; i <= 30; i++)
{
int percent = (i * 100) / 30;
_worker.ReportProgress(percent);
for(int j = 0; ....)
....
}
Если у вас есть только 1 цикл, создайте задержку: 'if ((counter% 100) == 0) ... `
Ваша цель в данном случае - это пользователь, от 10 до 100 звонков в Reportprogress.