오류 상태가 발생하면 작업을 취소하고 작업을 취소합니다 .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;
}
논리적 인 소리, 감사합니다! taskCancellationToken은 ResponsibilityChain을 실행하는 ConvertData에 전달 될 수 있습니다. Ill는 IsInError가 설정되는 각 단계에서 작업 오류를 발생시켜야한다고 생각합니다. – RobDog888