4

私は次のタスクを持っています

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/呼び出しスレッドに戻すための最良の方法は何ですか?

4

2 に答える 2

2

おそらく、Visual Studio の [マイ コードのみ] モード (デフォルトでオン) に関係しています。TPL が例外を監視する前に、デバッガーが壊れています。ボックスのチェックを外してみて、問題が解決するかどうかを確認してください ([ツール] -> [オプション] -> [デバッグ] -> [全般] の順に選択し、ボックスのチェックを外します)。

于 2012-03-09T00:05:29.637 に答える
1

を取得するOperationCancelledExceptionには、Task のコンストラクターに渡されたトークンと同じトークンを使用してスローする必要があります。

new Task<bool>(state =>
    UtilsDB.DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB),
        "Duplicating SQL Proceedures", token);
于 2012-03-15T19:53:42.027 に答える