私は次のタスクを持っています
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
が、それを処理する方法について混乱しています。私が見たすべての例は、キャンセルの原因となったイベント内のUIスレッドでの「操作がキャンセルされました...」などの印刷を処理します。キャンセルをキャプチャしてUI/呼び出しスレッドに戻すための最良の方法は何ですか?