2014-09-03 2 views
0

오류 상태가 발생하면 작업을 취소하고 작업을 취소합니다 .cancelationsource.cancel (true) 그러면 차례대로 예외가 throw됩니다.모든 작업이 완료되기 전에 오류시 작업 취소

문제가 발생하면 모든 작업이 완료 될 때까지 취소가 실행되지 않습니다. IsInError.Value는 오류 메시지가 메시지 컬렉션에 추가 될 때 시작되는 NotifyCollectionChanged 이벤트에 설정됩니다.

"모든 작업이 완료 될 때까지 모든 작업을 유지하는 아마도"Task.WhenAll (작업)을 기다려야합니다. 오류가 있는지 평가할 수 있습니다.

return Task.Run(async() => 
{ 
    concreteModel.TotalStepCount.Value = 11; 
    try 
    { 
     if (args.EventArgs.EtlOperationType == EtlOperationType.StandardVehicle) 
     { 
      concreteModel.CompletedStepCount.Value += 1; 
     } 
     List<Task> tasks = new List<Task>(); 
     tasks.Add(Task.Run(() => StandardVehicleConversionStorageProxy.ConvertData(container, importRawData), taskCancellationToken)); 

     await Task.WhenAll(tasks); 
     if (concreteModel.IsInError.Value) 
     { 
      taskCancellationTokenSource.Cancel(true); 
     } 
    } 
    finally 
    { 
     conversionOperation.IsInProgress.Value = false; 
     if (subscription != null) 
     { 
      subscription.Dispose(); 
     } 
    } 
}, taskCancellationToken); 

그리고 작업 취소 오류가 호출 프로 시저로 처리됩니다 ...

private async Task<bool> convertAsync() 
{ 
    try 
    { 
     await ConversionOperations.Single(x => x.OperationType == EtlOperationType.StandardVehicle).ConvertAsync(Container, _cancellationSource, ImportRawData); 
    } 
    catch (TaskCanceledException ex) 
    { 
     // handle the throw task cancellation exception 
     ex.Task.Dispose(); 
     return false; 
    } 
    finally 
    { 
     IsConverting.Value = false; 
    } 
    return true; 
} 

답변

1

당신은 await Task.WhenAll(tasks);를 호출 한 후 오류를 확인하고 있습니다. 이것은 모든 작업이 완료 될 때까지는 발생하지 않습니다.

대신 작업이 실행되는 동안 이벤트 처리기에서 taskCancellationTokenSource.Cancel(true);을 호출해야합니다.

또한 StandardVehicleConversionStorageProxy.ConvertDatataskCancellationToken을 전달하고 취소 요청을 처리하기 위해 CancellationToken.IsCancellationRequested 또는 CancellationToken.ThrowIfCancellationRequested()를 사용하여 토큰 취소를 확인해야합니다.

+0

논리적 인 소리, 감사합니다! taskCancellationToken은 ResponsibilityChain을 실행하는 ConvertData에 전달 될 수 있습니다. Ill는 IsInError가 설정되는 각 단계에서 작업 오류를 발생시켜야한다고 생각합니다. – RobDog888

관련 문제