#.net #sql #vb.net #multithreading
#.net #sql #vb.net #многопоточность
Вопрос:
У меня возникает ситуация, когда я открываю диалоговое окно, содержащее сообщение «Пожалуйста, подождите», запускаю SQL-запрос, затем заменяю сообщение «Пожалуйста, подождите» на DataGridView, содержащий собранные результаты.
Код, который я использую для этого, в основном:
Dim X As New Data.SqlClient.SqlCommand
X.CommandText = "SELECT some_data FROM someTable"
Dim XAdapter As New System.Data.SqlClient.SqlDataAdapter(X)
Dim XSet As New DataSet
XAdapter.Fill(XSet, "MyTable")
Me.someDataGridView.DataSource = XSet.Tables("MyTable").DefaultView
Я хотел бы поместить извлечение этих данных в фоновый поток, чтобы пользовательский интерфейс не зависал во время загрузки больших наборов данных, но, сделав это, я также хотел бы разрешить пользователю отменять и закрывать диалоговое окно, если доступ к данным занимает больше времени, чем они хотят ждать.
На данный момент это диалоговое окно может принимать некоторую произвольную строку SQL и отображать результаты (используя SqlDataAdapter) без какого-либо дополнительного кода.
Как я могу сделать этот процесс прерываемым, сохраняя при этом простоту доступа к адаптеру SqlDataAdapter?
Ответ №1:
Как я могу сделать этот процесс прерываемым, сохраняя при этом простоту доступа к адаптеру SqlDataAdapter?
Согласно документации, вы должны иметь возможность вызывать Close
базовый SqlConnection
экземпляр. В документации говорится, что это приведет к завершению и откату любых ожидающих транзакций. Кроме того, вместо использования a SqlDataAdapter
(который, к сожалению, не имеет асинхронных Fill
методов), которые вы могли бы использовать SqlCommand.BeginExecuteReader
, и как только это будет сделано, вы сможете заполнить a DataTable
, вызвав перегрузку DataTable.Load
, которая принимает IDataReader
. Если вы хотите прервать ожидающую выполнения команду, просто вызовите Close
.
Комментарии:
1. Не подумал о том, чтобы просто вызвать Close. Все компоненты транзакции являются локальными для метода. Спасибо за понимание.