2012-03-08 6 views
4

I Iは、標準的なキャンセルの検出を持っている方法DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB)で次のタスク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()); 

があります

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スレッド上で「Operation Cancelled ...」などの印刷を処理しています。取り消しをキャプチャしてUI /呼び出しスレッドに戻す最も良い方法は何ですか?

+0

処理されない例外は何ですか? –

+0

ええと、実際にテストコードに例外があります。 DuplicateSqlProcsFrom()メソッドが速く終了していないことを確かめますか? –

+0

また、これはどのコンテキストから開始されますか?別のスレッド? UIスレッド? –

答えて

1

OperationCancelledExceptionを取得するには、タスクのコンストラクタに渡されたもの:

new Task<bool>(state => 
    UtilsDB.DuplicateSqlProcsFrom(token, mainForm.mainConnection, strDbA, strDbB), 
     "Duplicating SQL Proceedures", token); 
2

ほとんどの場合、Visual Studioでジャストマイコードモード(デフォルトでチェックされている)と関係があります。デバッガはTPLが例外を観察する前に中断しています。チェックボックスをオフにして、それがクリアされているかどうかを確認してください(ツール→オプション→デバッグ→一般)。

関連する問題