首页 > 解决方案 > 解决另一个异步调用后触发一个异步调用

问题描述

我正在尝试在 asp.net 中学习有关异步控制器的知识

所以我创建了一个控制器:

[Route("api/[controller]")]
public class SummonerController : Controller
{
    [HttpGet("[action]/{name}")]
    public async Task<SummonerDTO> GetSummonerData(string name)
    {
        SummonerEndPoint endPoint = new SummonerEndPoint();
        Task<SummonerDTO> data =  endPoint.GetSummonerData(name);
        var readed = await data;
        MatchesEndPoint endPoint2 = new MatchesEndPoint();
        var data2 = endPoint2.GetMatches(data.Result.accountId.ToString());
        var readed2 = await data2;
        return await endPoint.GetSummonerData(name);
    }
}

正如您在第二个请求中看到的,我使用从第一个请求收到的数据。我知道第二个请求有可能在第一个请求之前得到解决。所以我的问题是有没有办法确保在第一个电话结束后触发第二个电话?

将两个结果合并到一个 dto 中是另一回事,但我不会把它放在这个问题上

标签: c#async-await

解决方案


如果你已经awaitTask做,那你很好。await如果您调用 async 方法而不是它,它们只会重叠。

作为旁注,

var result = await task;

等待任务异步完成并获取结果。

var result = task.Result;

同步等待任务(阻塞线程)。

您可以将代码更改为

var summonerEndPoint = new SummonerEndPoint();
var summonerData =  await summonerEndPoint.GetSummonerData(name);
var matchesEndPoint = new MatchesEndPoint();
var matches = await matchesEndPoint.GetMatches(summonerData.accountId.ToString());
return summonerData;

推荐阅读