假设我有一个从服务器获取数据的方法
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/