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

本文关键字:同步 任务 包装 异步 取消 | 更新日期: 2023-09-27 18:08:33

我有调用外部库同步操作的代码,这可能需要很长时间才能完成。我不能重写这个库,也没有停止操作的方法。是否有办法在超时后停止此任务?

我已经尝试过这个代码,但它不工作,不像我预期的那样。它等待,直到计算未完成。

如何解决这个任务?

 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);
    }

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

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

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

等待或者任务完成:

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

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