Я попытался сделать заголовок максимально конкретным. В основном то, что у меня работает в потоке backgroundworker, теперь - это код, который выглядит так:
SqlConnection conn = new SqlConnection(connstring);
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(Results);
conn.Close();
sda.Dispose();
Где запрос - это строка, представляющая большой, требующий много времени запрос, а conn - объект соединения.
Теперь моя проблема: мне нужна кнопка остановки. Я понял, что убить фонового рабочего бесполезно, потому что я все еще хочу сохранить, какие результаты остались после завершения запроса. Плюс он не сможет проверить отмененное состояние до запроса.
Что я до сих пор придумал:
Я пытаюсь концептуализировать, как эффективно справляться с этим, не принимая слишком большого значения производительности.
Моя идея состояла в том, чтобы использовать SqlDataReader для чтения данных из части запроса за раз, чтобы у меня был "цикл", чтобы проверить флаг, который я мог бы установить из графического интерфейса с помощью кнопки. Проблема в том, насколько я знаю, я не могу использовать метод Load() для datatable и все еще могу отменить sqlcommand. Если я ошибаюсь, сообщите мне, потому что это упростит отмену.
В свете того, что я обнаружил, я пришел к пониманию, я могу только отменить sqlcommand mid-query, если бы сделал что-то вроде ниже (псевдокод):
while(reader.Read())
{
//check flag status
//if it is set to 'kill' fire off the kill thread
//otherwise populate the datatable with what was read
}
Однако мне показалось бы, что это будет крайне неэффективно и, возможно, дорогостоящим. Это единственный способ убить sqlcommand в прогресс, который абсолютно должен быть в datatable? Любая помощь будет оценена!