Пишу winforms приложение на .net 4.0. Есть задача показывать диалог ожидания с кнопкой отмены выполнения запроса во время выполнения запросов к бд.
Код формы:
public partial class LoadingFrm : Form
{
//task for execute query
private Task execute;
//action for cancelling task
private Action cancel;
public LoadingFrm(Task e, Action c)
{
execute = e;
cancel = c;
InitializeComponent();
this.cancelBtn.Click += this.cancelBtn_Click;
this.FormBorderStyle = FormBorderStyle.None;
this.Load += (s, ea) =>
{
//start task
this.execute.Start();
//close form after execution of task
this.execute.ContinueWith((t) =>
{
if (this.InvokeRequired)
{
Invoke((MethodInvoker)this.Close);
}
else this.Close();
});
};
}
//event handler of cancel button
private void cancelBtn_Click(object sender, EventArgs e)
{
cancel();
}
}
Код класса, с помощью которого выполняются SqlCommand-ы :
public class ExecuteHelper
{
public static SqlDataReader Execute(SqlCommand command)
{
var cts = new CancellationTokenSource();
var cToken = cts.Token;
cToken.Register(() => { command.Cancel(); });
Task<SqlDataReader> executeQuery = new Task<SqlDataReader>(command.ExecuteReader, cToken);
//create a form with execute task and action for cancel task if user click on btn
LoadingFrm _lFrm = new LoadingFrm(executeQuery, () => { cts.Cancel(); });
_lFrm.ShowDialog();
SqlDataReader r = null;
try
{
r = executeQuery.Result;
}
catch (AggregateException ae)
{
}
catch (Exception ex)
{
}
return r;
}
}
По нажатии на кнопку отменить, я вызываю метод
cts.Cancel();
который в свою очередь вызывает метод
command.Cancel();
Проблема в том, что запрос все таки не прерывается. Через некоторое время, от sql сервера все таки приходят данные.
Вопрос: как остановить выполнение
SqlCommand.ExecuteQuery()
PS: Может вы решали подобные задачи другим способом, поделитесь опытом. Задача состоит в том, чтобы показывать диалоговое окно(позволяющее отменить выполнение запроса), во время выполнения запроса. Может лучше делать с помощью
BeginExecuteReader();
и
EndExecuteReader();
Stackoverflow