2012-03-08 4 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."); 
} 

그러나 나는를 잡을 수 있습니다., 여기서 내가 뭘 잘못하고 있니?

편집 방법 : 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이 예외를 관찰하기 전에 깨고 있습니다. 상자를 선택 취소하고 항목이 지워지는지 확인하십시오 (도구 -> 옵션 -> 디버깅 -> 일반).

관련 문제