强制取消异步包装同步任务

时间:2016-09-23 13:07:08

标签: c# async-await

我有调用外部lib同步操作的代码,这可能需要很长时间才能完成。我无法重写此lib,并且没有一种方法可以停止操作。是否有任何解决方案可以在超时后停止此任务?

我已经尝试过这段代码,但它并不像我预期的那样有用。等待计算没有完成。

我该如何解决这个问题?

 private static async Task<ResultData> GetResultAsync(string fileName)
    {
        var timeoutSource = new CancellationTokenSource(new TimeSpan(0, 5, 0)); 
        try
        {
            return await Task.Run(() =>
            {
                var result = ExternLib.Calculate(fileName);
                if (result == null)
                {
                    throw new CalculationException(fileName);
                }
                return result;
            },
                timeoutSource.Token
            ).ConfigureAwait(false);
        }
        catch (AggregateException e)
        {
            SomeCode(e);
        }
        catch (OperationCanceledException e)
        {
            SomeCode2(e);
        }
        catch (Exception e)
        {
            SomeCode3(e);
        }
        return await Task.FromResult<ResultData>(null).ConfigureAwait(false);
    }

1 个答案:

答案 0 :(得分:1)

创建两个任务,一个完成工作,另一个充当计时器:

var workTask = Task.Run(() => // etc );
var timerTask = Task.Delay(TimeSpan.FromMinutes(10));

等待 任务完成:

var completedTask = Task.WaitAny(new[] { workTask, timerTask });

然后,如果completedTask是计时器任务,那么你的超时已经过期,你可以采取适当的行动:你是否可以停止长时间运行的任务取决于它的方式&# 39;结构化,但你知道你可以停止等待它。