任务在完成所有任务之前发生错误时取消
问题描述:
因此,我试图在发生错误状态时取消任务并抛出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;
}
答
你打电话await Task.WhenAll(tasks);
后检查错误。直到所有任务完成后才会发生这种情况。
相反,您应该在任务仍在运行时在事件处理程序中调用taskCancellationTokenSource.Cancel(true);
。
您还需要通过taskCancellationToken
到StandardVehicleConversionStorageProxy.ConvertData
和使用CancellationToken.IsCancellationRequested
或CancellationToken.ThrowIfCancellationRequested()
处理取消请求检查令牌取消。
声音合乎逻辑,谢谢! taskCancellationToken可以传递给执行ResponsibilityChain的ConvertData。我认为我必须在设置IsInError的每个步骤中引发任务错误。 – RobDog888 2014-09-03 18:11:17