У меня есть следующая задачаTPL Как правильно отменить задачу
cancelSource = new CancellationTokenSource();
token = cancelSource.Token;
string strDbA = textBox1.Text;
string strDbB = textBox2.Text;
// Start duplication on seperate thread.
asyncDupSqlProcs =
new Task<bool>(state =>
UtilsDB.DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB), "Duplicating SQL Proceedures");
asyncDupSqlProcs.Start();
asyncDupSqlProcs.ContinueWith(task =>
{
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.Faulted:
// Error-handling logic...
break;
case TaskStatus.RanToCompletion:
if (asyncDupSqlProcs.Result)
Utils.InfoMsg(String.Format(
"SQL stored procedures and functions successfully copied from '{0}' " +
"to '{1}'", strDbA, strDbB));
break;
case TaskStatus.Canceled:
Utils.InfoMsg("Copy cancelled at users request.");
break;
}
}, TaskScheduler.FromCurrentSynchronizationContext());
В методе DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB)
у меня есть стандартное обнаружение отмены:
if (_token.IsCancellationRequested)
_token.ThrowIfCancellationRequested();
Событие отмены является нажатие кнопки на главной формы, внутри события щелчка У меня есть:
try
{
cancelSource.Cancel();
asyncDupSqlProcs.Wait();
}
catch (AggregateException aggEx)
{
if (aggEx.InnerException is OperationCanceledException)
Utils.InfoMsg("Copy cancelled at users request.");
}
, но я могу показаться, что поймаю AggregateException
, что я здесь делаю неправильно?
Редактировать: Внутри метода DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB)
Я могу поймать OperationCancelledException
, но я смущен о том, как с ним обращаться. Весь пример, который я видел, обрабатывает печать «Operation Canceled ...» и т. Д. В потоке пользовательского интерфейса в событии, вызвавшем отмену. Каков наилучший способ захвата отмены и передачи его обратно в пользовательский интерфейс/вызывающий поток?
В чем исключение, которое не обрабатывается? –
Хммм, я получаю исключение на моем тестовом коде. Вы уверены, что метод DuplicateSqlProcsFrom() не работает быстро? –
И в каком контексте это происходит? другой поток? Пользовательский интерфейс? –