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/호출 스레드로 다시 전달하는 가장 좋은 방법은 무엇입니까?
처리되지 않는 예외는 무엇입니까? –
흠, 실제로 테스트 코드에서 예외가 발생합니다. DuplicateSqlProcsFrom() 메서드가 빠르게 종료되지 않았습니까? –
또한 어떤 상황에서 시작됩니까? 다른 스레드? UI 스레드? –