【问题标题】:Calling Async method调用异步方法
【发布时间】:2020-01-17 04:02:15
【问题描述】:

我正在尝试像这样使用await 运算符调用异步方法SendParkInfo 方法

await Task.WhenAny(parkList);和await Task.WhenAny(parkInfo);

parkInfo 拥有SendParkInfo 方法对象

这是我的代码的一部分。

    public async Task<AvailableParksResponse> GetAvailableParks(IEnumerable<string> parkRegionList)
    {
    //
        var parkList = parkRegionList.Select(x => SendParkInfo(x)).ToList();
        var parkListTask = await Task.WhenAny(parkList);
        response.ParkInfoList = new List<Task<ParkInfo>> { parkListTask };

        var parkInfo = SendParkInfo(id);
        var parkTask = await Task.WhenAny(parkInfo);
        response.ParkInfo = new List<Task<ParkInfo>> { parkTask };

    //
    }

    public virtual async Task<ParkInfo> SendParkInfo(string id) 
    {
    //
        var apiResponse = await apiClient.GetAsync(RequestUri + id);
    //
    }

是否可以像我调用的方式那样调用SendParkInfo,然后使用await 运算符和Task.WhenAny 方法。或者有没有更好的调用Async SendParkInfo方法的方法

任何帮助或建议将不胜感激。

提前致谢

【问题讨论】:

  • 这里似乎有一些编译问题。您正在尝试将IEnumerable&lt;string&gt; parkList 重新定义为IList&lt;Task&lt;ParkInfo&gt;&gt;,这是故意的吗?
  • @NathanTaylor 抱歉,我误解了你的问题。 response.ParkInfoList 就像这样 public IEnumerable> ParkInfo { get;放; }
  • 你的例子太稀疏了。 GetAvailableParks 中的 id 来自哪里? AvailableParksResponse 如何使用?拥有公园列表但只返回第一个完成的公园有什么意义?
  • Task.WhenAny() 需要一个任务集合,但您将它与单个 Task&lt;ParkInfo&gt; 一起使用,并将 SendParkInfo(id) 的结果传递给它。
  • 为什么需要使用WhenAny?您不能等待 SendParkInfo 吗?

标签: c# .net asp.net-mvc asynchronous async-await


【解决方案1】:

Task.WhenAny() 将返回一个Task,当传递给WhenAny() 的任务列表中的至少一项已完成时,该Task 被视为已完成。如果您希望在处理完成时以增量方式返回数据,这通常是一个合适的选项。

或者,如果您的意图是仅在所有异步任务完成后返回结果,请考虑Task.WhenAll()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多