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号