Вы не сказали, какая строка в вашем коде выдает ошибку, но я почти уверен, что именно эта, верно?
Stocks_DT.ItemsSource = dt.DefaultView;
И Stocks_DT
- это элемент управления в вашем окне, верно?
Это источник вашей проблемы. Как говорится в сообщении об ошибке, вы можете получить доступ только к элементам пользовательского интерфейса из потока пользовательского интерфейса (основного потока). Поскольку вы выполняете указанный выше код в фоновом потоке, он выдает это исключение.
Вместо этого вам необходимо передать результаты запроса обратно в основной поток , а затем назначить егоStocks_DT.ItemsSource
. Я бы рекомендовал использовать свойство DoWorkEventArgs.Result
. Я бы предложил использовать DataTable
в качестве результата, чтобы код был e.Result = dt
. Вы можете получить доступ к Result
из события BackgroundWorker.RunWorkerCompleted
.
Вышесказанное разрешит исключение, но я считаю, что есть ряд других вещей, которые я должен рассмотреть в вашем коде, просто взаинтересованность в том, чтобы помочь вам.
Прежде всего, вы, кажется, повторяете один и тот же точный запрос 100 раз без каких-либо изменений. Похоже, это было бы пустой тратой времени, так как вы бы получили один и тот же результат 100 раз. Если это так, вам, вероятно, вообще не нужен индикатор выполнения.
Во-вторых, обычно рекомендуется открывать новый SqlConnection
, когда он нужен, и закрывать его, когда он закончен,вместо того, чтобы держать одно соединение открытым в течение всего времени существования программы / окна. Это особенно верно, когда вы вступаете в многопоточность. Вы можете найти больше информации в этом вопросе . При создании этих соединений они должны быть заключены в оператор using
.
В-третьих, C # поддерживает многострочные строки, как показано в этого вопроса . Использование этого метода сделает запрос SQL более читабельным, избавившись от всех "..." + "..."