在完成所有任务之前,任务取消时出错

时间:2014-09-03 17:19:35

标签: c#

因此我尝试在发生错误状态时取消任务并抛出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;
}

1 个答案:

答案 0 :(得分:1)

您在致电await Task.WhenAll(tasks);后重新检查错误。在所有任务完成之前,这不会发生。

相反,当任务仍在运行时,您应该在事件处理程序中调用taskCancellationTokenSource.Cancel(true);

您还需要将taskCancellationToken传递给StandardVehicleConversionStorageProxy.ConvertData并使用CancellationToken.IsCancellationRequestedCancellationToken.ThrowIfCancellationRequested ()检查令牌取消以处理取消请求。