C# 如何优雅地取消正在运行的任务
第三方API中有一个查询订单信息的同步方法,GetOrderInfo(string orderNo);这个方法耗时比较久可能在1s到5s之间;我先调用了一次GetOrderInfo方法,然后立刻又调用第二次GetOrderInfo,我希望在第二次调用GetOrderInfo方法时结束掉上一次还未执行完成的任务。这种场景该如何处理。
下面给出一种示例:
private CancellationTokenSource cts = new CancellationTokenSource();
private async void addBtn_Click(object sender, RoutedEventArgs e)
{
try
{
// 不管怎样先取消(如果之前有任务在运行会被取消掉)
cts.Cancel();
}
finally
{
cts.Dispose();
// 重新给取消标志赋值
cts = new CancellationTokenSource();
}
try
{
Console.WriteLine("执行...");
await RunWrapper(cts.Token);
Console.WriteLine("执行完成...");
}
catch (OperationCanceledException)
{
Console.WriteLine("取消..");
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}
private async Task RunWrapper(CancellationToken token)
{
// 由于t1是一个永远不会结束的任务
var t1 = Task.Delay(-1, token);
var t2 = Task.Run(() =>
{
// 假设这是第三方同步接口的调用
Thread.Sleep(5*1000);
});
// 任务1或任务2任意一个任务执行完成 那么程序就会向下继续执行
await Task.WhenAny(t1, t2);
// 如果有任务执行完成,且执行完成的不是任务2,那么一定是任务1被取消了
if (!t2.IsCompleted)
{
// 直接抛出异常 让本方法(本任务)直接Over!
throw new OperationCanceledException(token);
}
}

浙公网安备 33010602011771号