【问题标题】:C# async subsequent calls return existing taskC# 异步后续调用返回现有任务
【发布时间】:2020-02-12 19:48:13
【问题描述】:

我有一个 Web 应用程序,它为数据调用外部 API。

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

如何在 c# 中使用 async/await 实现这一点?

【问题讨论】:

  • 结果应该有多持久?如果第二个电话在几个小时后到来,它应该仍然使用第一个电话获得的结果还是开始一个新的电话?
  • 有一段时间的结果是“新鲜”的,过了这段时间我需要再次调用

标签: c# asynchronous async-await


【解决方案1】:

后续调用返回现有任务

当然,您可以通过保留 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&lt;T&gt; 而不是Task&lt;T&gt;
  • 如果旧调用已经完成,这段代码是否应该在下一次调用时重新加载资源?如果是这样,则需要在调用完成时替换缓存的Task&lt;T&gt;/AsyncLazy&lt;T&gt;
  • 缓存错误是否正常,或者下一次调用是否应该总是重试之前的任何错误?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2019-06-10
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多