为什么在 C# 内联中使用任务和异步等待?

问题描述 投票:0回答:1

他们说任务很好,因为它们是非阻塞的。这就说得通了。一段时间以来,我们有了异步的一切——mvc 中的异步操作、异步 Web api 调用、异步 ef 方法等。 我不明白的一件事是——为什么? 假设我们有一个方法:

public async Task<User> GetUserAsync(int id, Cancellationtoken cancellationToken = default)
{
    return await _unitOfWork.Users.SingleOrDefaultAsync(x => x.Id == id, cancellationToken);
}

这里使用task、async和wait有什么好处?对我来说,同步版本似乎没有任何好处:

public User GetUser(int id)
{
    return _unitOfWork.Users.SingleOrDefault(x => x.Id == id);
}

假设此方法是从 Web api 控制器调用的。所以我们要么 return

_usersService.GetUser(id);
要么
return await _usersService.GetUserAsync(id);
- 但我们等待这个异步方法在这里完成,在执行时不做任何工作。

我可以在下面的示例中看到这样做的唯一好处:

public async Task<User> GetUserAsync(int id, CancellatioNtoken cancellationToken = default)
{
    var userTask = _unitOfWork.Users.SingleOrDefaultAsync(x => x.Id == id, cancellationToken);
    // ... here we can do some work, some calculation for which we actually do not need user
    return await userTask;
}

在这个例子中,我们可以从任务和异步/等待中受益,因为我们开始检索用户,同时我们做了一些工作,但在第一个例子中我们没有任何工作 - 我们说给我们一个用户异步,但我们等待它立即就位。

第一个例子中的代码遍布github,每个人都这样写,我不明白为什么

换句话说,使用立即等待的异步方法是否有意义?它与同步使用有何不同?如果不是——为什么人们以这种方式编写代码?如果是 - 你能解释一下它有什么不同吗?

c# asynchronous async-await task task-parallel-library
1个回答
0
投票

让我们做一个假设:

您需要调用 3 个不同的 API 来处理您这边的信息。

1:只需要相应 API 的响应,但其他进程需要两个答案才能完成。

您对主 API 进行了 1 个异步调用,但您希望系统还初始化需要调用 2 个其他 API(取决于这两个请求)的调用。

2:您创建 2 个任务,并在继续之前需要完成的任务“列表”上执行“WaitAll”。

现在两个进程都可以模拟运行了。

系统将简单地适当处理这 3 个请求。

异步任务适用于当您需要系统处理多个不直接相关的事情时。

假设您有一个基于队列的系统,打算获取一些主数据,然后还需要获取一些产品数据,以创建上个月完成的订单报告。在继续之前,您必须拥有主数据和产品数据,但假设主数据很慢,例如 1 秒,而产品数据较快,例如 0.5 秒。

如果同步执行,总处理时间为1.5秒。

然而,理论上,异步在理想条件下“仅”与最慢的线程一样慢。所以现实生活中的运行时间为 1 秒。 (尽管处理它们的 CPU 周期相同)

好处是,您可以节省现实世界的时间,但可以这么说,允许处理器并行处理操作。

至少,据我所知是这样。我相信还有更“专业和精确的描述”。但随后我会让其他人纠正我的错误。

© www.soinside.com 2019 - 2024. All rights reserved.