2014-09-03 54 views
0

因此,我试图在发生错误状态时取消任务并抛出taskcancelationsource.cancel(true),然后抛出异常。任务在完成所有任务之前发生错误时取消

问题是,当发生错误时,取消不会被调用,直到所有任务完成之后。 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);

您还需要通过taskCancellationTokenStandardVehicleConversionStorageProxy.ConvertData和使用CancellationToken.IsCancellationRequestedCancellationToken.ThrowIfCancellationRequested()处理取消请求检查令牌取消。

+0

声音合乎逻辑,谢谢! taskCancellationToken可以传递给执行ResponsibilityChain的ConvertData。我认为我必须在设置IsInError的每个步骤中引发任务错误。 – RobDog888 2014-09-03 18:11:17

相关问题