强制取消异步包装同步任务
本文关键字:同步 任务 包装 异步 取消 | 更新日期: 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
是计时器任务,那么您的超时时间已经过期,您可以采取适当的行动:是否可以停止长时间运行的任务取决于它的结构,但您知道您可以停止等待