一定时间后取消 Task.WhenAll

如何解决一定时间后取消 Task.WhenAll

我有一个异步操作,它接受一个航空公司列表作为参数并返回一些数据,我有一个我想要获取数据的航空公司列表。

但是,如果在一段预定义的时间后我无法获取所有这些航空公司的数据,我想停止等待并向用户返回其他内容

public async Task Run()
{
    var watch = System.Diagnostics.Stopwatch.StartNew();
    await RunAirline();
    watch.Stop();
    Console.WriteLine($"Total Execution Time: {watch.ElapsedMilliseconds + Environment.NewLine}");
    //return $"Total Execution Time: {watch.ElapsedMilliseconds + Environment.NewLine}";
    //Console.ReadLine();
}

private static async Task RunAirline()
{
    try
    {
        List<string> AirlineList = GetAirLineCodes();
        List<Task<WebsiteDataModel.WebsiteDataModel>> taskList = new List<Task<WebsiteDataModel.WebsiteDataModel>>();
        foreach (string AirlineCode in AirlineList)
        {
            taskList.Add(Task.Run(() => CallindividualAirline(AirlineCode)));

        }
        var result = await Task.WhenAll(taskList);
        foreach (WebsiteDataModel.WebsiteDataModel model in result)
        {
            display(model);
        }
    }
    catch (Exception Ex)
    {
        Console.WriteLine(Ex.Message.ToString());
    }
}

private static List<string> GetAirLineCodes()
{
    return new List<string>() 
    {
        "A","B","C"
    };
}

private static void display(WebsiteDataModel.WebsiteDataModel result)
{
    Console.WriteLine($"Website Content as {result.DataContent},Website Name as :  {result.WebsiteName} Status as : {result.Status},Content length as : {result.WebsiteData.Length} ----- Error as  : {result.error.FaultException.ToString()}." + Environment.NewLine);
}

private static WebsiteDataModel.WebsiteDataModel CallindividualAirline(string AirlineCode)
{
    WebsiteDataModel.WebsiteDataModel LobjWebsiteDataModel = new WebsiteDataModel.WebsiteDataModel();
    WebsiteDataModel.ErrorData LobjErrorData = new WebsiteDataModel.ErrorData();
    try
    {
        switch (AirlineCode)
        {
            // calling Airline API...........
            case "A":
                ClsAirOne LobjAirOne = new ClsAirOne();
                LobjWebsiteDataModel = LobjAirOne.GetAirDataData("https://book.xxxxx.com");
                return LobjWebsiteDataModel;
            case "B":
                ClsAirTwo LobjAirTwo = new ClsAirTwo();
                LobjWebsiteDataModel = LobjAirTwo.GetAirData("https://book.xxxxx.in");
                return LobjWebsiteDataModel;
            case "C":
                ClsAirThree LobjAirThree = new ClsAirThree();
                LobjWebsiteDataModel = LobjAirThree.GetAirData("https://xxxxx.in/");
                return LobjWebsiteDataModel;

            default:
                return LobjWebsiteDataModel;
        }


    }
    catch (Exception Ex)
    {

        LobjWebsiteDataModel.Status = "0";
        LobjWebsiteDataModel.WebsiteData = "";
        LobjErrorData.FaultException = "ERR-01" + Ex.Message.ToString();
        LobjWebsiteDataModel.error = LobjErrorData;
        return LobjWebsiteDataModel;
    }
}

解决方法

执行此操作的最佳方法是取消传递给 Task.WhenAll 的每个操作。您可以创建一个带有超时的取消令牌源,然后将其 CancellationToken 传递给实际执行 I/O 的方法。

例如:

public async Task Run()
{
  ...
  using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
  await RunAirline(cts.Token);
  ...
}

private static async Task RunAirline(CancellationToken cancellationToken)
{
  ...
  foreach (string AirlineCode in AirlineList)
    taskList.Add(Task.Run(() => CallindividualAirline(AirlineCode,cancellationToken)));
  ...
}

private static WebsiteDataModel.WebsiteDataModel CallindividualAirline(string AirlineCode,CancellationToken cancellationToken)
{
  ...
  ClsAirOne LobjAirOne = new ClsAirOne();
  LobjWebsiteDataModel = LobjAirOne.GetAirDataData("https://book.xxxxx.com",cancellationToken);
  ...
  ClsAirTwo LobjAirTwo = new ClsAirTwo();
  LobjWebsiteDataModel = LobjAirTwo.GetAirData("https://book.xxxxx.in",cancellationToken);
  ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?