Проблема в том, что вы вызываете .BeginInvoke()
в вашем RefreshReport()
методе. Метод BackgroundWorker.DoWork()
уже вызван в другом потоке, поэтому вы можете просто вызвать rvReport.RefreshReport()
. Это должно выглядеть так:
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
rvReport.RefreshReport()
End Sub
Это действительно так просто, возможно добавление Monitor
для блокировки объекта отчета и предотвращения повторного ввода.
Прямо сейчас, когда вы вызываете .BeginInvoke()
, начинается процесс отчета, но он вообще не блокируется, поэтому для метода DoWork()
ничего не остается. Это просто возвращается сразу. На этом этапе BackgroundWorker считает, что это сделано, поэтому вызывает метод .RunWorkerCompleted()
, который останавливает индикатор выполнения.
На основании комментария rvReport
- это визуальный элемент управления, а не компонент или простой класс доступа к данным. В этом случае вы должны знать, что визуальные элементы управления в .Net не являются поточно-ориентированными, и поэтому никогда не должен напрямую делать что-либо напрямую, для завершения которого требуется больше нескольких минут. Обручи, через которые вы прыгали с помощью .BeginInvoke()
в методе RefreshReport()
, вызывали вашу долгосрочную функцию в главном потоке пользовательского интерфейса .
Чтобы решить эту проблему, вам нужно либо отключить перекрестную проверку потоков, чтобы исключение не создавалось (просто, но не рекомендуется), либо изменить способ использования элемента управления, чтобы основная работа происходила в другом месте, а элемент управления просто вызывает события, когда все готово. Если вы не можете изменить элемент управления до такой степени, это недостаток дизайна в элементе управления.