gpt4 book ai didi

c# - 此 MSDN 示例中 Lazy 的用途

转载 作者:太空狗 更新时间:2023-10-30 01:03:46 29 4
gpt4 key购买 nike

我一直在读这个Asynchronous article from MSDN , 但我无法理解 Lazy<T> 的目的在给定的例子上。

public class AsyncCache<TKey, TValue>
{
private readonly Func<TKey, Task<TValue>> _valueFactory;
private readonly ConcurrentDictionary<TKey, Lazy<Task<TValue>>> _map;

public AsyncCache(Func<TKey, Task<TValue>> valueFactory)
{
if (valueFactory == null) throw new ArgumentNullException("loader");
_valueFactory = valueFactory;
_map = new ConcurrentDictionary<TKey, Lazy<Task<TValue>>>();
}

public Task<TValue> this[TKey key]
{
get
{
if (key == null) throw new ArgumentNullException("key");
return _map.GetOrAdd(key, toAdd =>
new Lazy<Task<TValue>>(() => _valueFactory(toAdd))).Value;
}
}
}

据我了解,当您调用 .Value 时的 Lazy<T>然后它将调用其中的构造函数。从例子来看,马上就调用了,为什么还要加Lazy<T>呢? ?

最佳答案

假设您将其修改为不使用 Lazy<T> .

public class AsyncCache<TKey, TValue>
{
private readonly Func<TKey, Task<TValue>> _valueFactory;
private readonly ConcurrentDictionary<TKey, Task<TValue>> _map;

public AsyncCache(Func<TKey, Task<TValue>> valueFactory)
{
if (valueFactory == null) throw new ArgumentNullException("loader");
_valueFactory = valueFactory;
_map = new ConcurrentDictionary<TKey, Task<TValue>>();
}

public Task<TValue> this[TKey key]
{
get
{
if (key == null) throw new ArgumentNullException("key");
return _map.GetOrAdd(key, toAdd => _valueFactory(toAdd));
}
}
}

See the remarks in the documentation:

If you call GetOrAdd simultaneously on different threads, addValueFactory may be called multiple times, but its key/value pair might not be added to the dictionary for every call.

所以 _valueFactory如果同时发生对同一 key 的多次访问,则可能会针对同一 key 多次调用。

现在如何使用Lazy<T>解决问题?虽然多个Lazy<Task<TValue>>实例可能由并发调用创建,GetOrAdd 只会返回一个实例.所以只有一个人会拥有它的 Value访问的属性。所以只打一个电话给_valueFactory将永远发生在每个键上。

这当然是一个理想的功能。如果我做了 AsyncCache<string, byte[]> cache这是用 lambda url => DownloadFile(url) 创建的, 我不想要一堆对 cache[myUrl] 的并发请求多次下载文件。

关于c# - 此 MSDN 示例中 Lazy<T> 的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26478998/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com