因此我尝试在发生错误状态时取消任务并抛出taskcancelationsource.cancel(true),这会引发异常。
问题是,当错误发生时,取消不会在所有任务完成之后被调用。 IsInError.Value在NotifyCollectionChanged事件中设置,当将错误消息添加到消息集合时会触发该事件。
我必须做“await Task.WhenAll(tasks)”,它可能会保持一切运行直到它们全部完成,我可以评估是否有错误。
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;
}
答案 0 :(得分:1)
您在致电await Task.WhenAll(tasks);
后重新检查错误。在所有任务完成之前,这不会发生。
相反,当任务仍在运行时,您应该在事件处理程序中调用taskCancellationTokenSource.Cancel(true);
。
您还需要将taskCancellationToken
传递给StandardVehicleConversionStorageProxy.ConvertData
并使用CancellationToken.IsCancellationRequested
或CancellationToken.ThrowIfCancellationRequested ()
检查令牌取消以处理取消请求。