C#异步后续调用返回现有任务

时间:2020-02-12 11:08:15

标签: c# asynchronous async-await

我有一个Web应用程序,该应用程序调用用于数据的外部API。

如果用户触发了此外部呼叫,并且该呼叫已经生效,我不希望第二个请求触发一个新呼叫,而是等待第一个呼叫的结果(该呼叫的结果将两个请求都相同)。

如何使用async / await在c#中实现此目标?

1 个答案:

答案 0 :(得分:2)

后续调用返回现有任务

当然,只需保留Task<T>对象然后将其返回即可。

类似的东西:

private async Task<T> ImplementationAsync();
private Task<T> _task;

public Task<T> InterfaceAsync()
{
  if (_task == null)
    _task = ImplementationAsync();
  return _task;
}

这是一个非常简单的示例。实际代码应考虑:

  • 可以从多个线程调用InterfaceAsync吗?如果是这样,则_task需要受到保护。
  • 此代码是否仅加载一次资源?如果是这样,请考虑使用AsyncLazy<T>代替Task<T>
  • 如果旧呼叫已经完成,此代码是否应在下一个呼叫中重新加载资源?如果是这样,则在通话结束后需要替换缓存的Task<T> / AsyncLazy<T>
  • 缓存错误是否正常,还是下一次调用应始终重试以前的任何错误?
相关问题