c# - 如何对等待第一次调用结果的异步方法进行不同的调用?

标签 c# asynchronous

假设我有一个从服务器获取数据的方法

Task<Result> GetDataFromServerAsync(...)

如果正在进行通话,我不想向服务器发起新请求,而是等待原始请求完成。

假设我有

var result = await objet.GetDataFromServerAsync(...);

而且在不同的地方,几乎在同一时间我有第二个电话

var result2 = await objet.GetDataFromServerAsync(...);

如果第一个没有完成,我不希望第二个向服务器发起新请求。我希望两个电话在第一次通话结束后立即获得相同的结果。这是一个概念证明,我有多种选择,但我想看看这样做有多么容易。

最佳答案

这是一个使用 Lazy<Task<T>> 的简单示例:

var lazyGetDataFromServer = new Lazy<Task<Result>>
    (() => objet.GetDataFromServerAsync(...));

var result  = await lazyGetDataFromServer.Value;
var result2 = await lazyGetDataFromServer.Value;

这些 2 await 没关系s 是从单独的线程完成的 Lazy<T>是线程安全的,所以 result2如果跑第二个,仍然会等待并使用来自 result 的相同输出.

使用 code from here您可以将其包装在一个名为 AsyncLazy<T> 的类中, 并添加自定义 GetAwaiter这样你就可以 await它不需要做.Value , 非常整洁 =)

关于c# - 如何对等待第一次调用结果的异步方法进行不同的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41707025/

相关文章:

c# - 在运行时将 JObject 转换为类型

c# - 异步/等待的用例是什么? [复制]

c++ - boost::async - 不确定实现

c# - 使用异步套接字为 TCP 代理服务器实现线程

c# - 如何使用 Playwright 获得下拉列表的选定选项

java - 在 RxJava 中组合未知数量的 Observable

multithreading - 套接字Winsock异步阻止同时读取写入

c# - 异步等待调用长时间运行的同步和异步方法

c# - 如何获得更好的读取文件的方法?

c# - Jquery 隐藏/显示 svg 图像