我有调用外部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);
}
答案 0 :(得分:1)
创建两个任务,一个完成工作,另一个充当计时器:
var workTask = Task.Run(() => // etc );
var timerTask = Task.Delay(TimeSpan.FromMinutes(10));
等待 任务完成:
var completedTask = Task.WaitAny(new[] { workTask, timerTask });
然后,如果completedTask
是计时器任务,那么你的超时已经过期,你可以采取适当的行动:你是否可以停止长时间运行的任务取决于它的方式&# 39;结构化,但你知道你可以停止等待它。