gpt4 book ai didi

c# - 如何使用 Lazy 处理并发请求?

转载 作者:可可西里 更新时间:2023-11-01 08:27:23 24 4
gpt4 key购买 nike

我是 C# 的新手,正在尝试了解如何使用 Lazy

我需要通过等待已运行操作的结果来处理并发请求。数据请求可能会同时使用相同/不同的凭据。

对于每组唯一的凭据,最多可以进行一个 GetDataInternal 调用,该调用的结果会在准备就绪时返回给所有排队的服务员

private readonly ConcurrentDictionary<Credential, Lazy<Data>> Cache
= new ConcurrentDictionary<Credential, Lazy<Data>>();

public Data GetData(Credential credential)
{
// This instance will be thrown away if a cached
// value with our "credential" key already exists.
Lazy<Data> newLazy = new Lazy<Data>(
() => GetDataInternal(credential),
LazyThreadSafetyMode.ExecutionAndPublication
);

Lazy<Data> lazy = Cache.GetOrAdd(credential, newLazy);
bool added = ReferenceEquals(newLazy, lazy); // If true, we won the race.
Data data;

try
{
// Wait for the GetDataInternal call to complete.
data = lazy.Value;
}
finally
{
// Only the thread which created the cache value
// is allowed to remove it, to prevent races.
if (added) {
Cache.TryRemove(credential, out lazy);
}
}

return data;
}

这是使用 Lazy 的正确方法还是我的代码不安全?


更新:

开始使用 MemoryCache 而不是 ConcurrentDictionary 是个好主意吗?如果是,如何创建键值,因为它是 MemoryCache.Default.AddOrGetExisting()

中的 string

最佳答案

这是正确的。这是一个标准模式(删除除外),它是一个非常好的缓存,因为它可以防止缓存冲压。

我不确定你是否想在计算完成后从缓存中删除,因为计算将以这种方式一遍又一遍地重做。如果您不需要删除,您可以通过基本上删除后半部分来简化代码。

注意,Lazy 在异常情况下有一个问题:异常被存储并且工厂永远不会被重新执行。问题永远存在(直到有人重新启动应用程序)。在我看来,这使得 Lazy 在大多数情况下完全不适合生产使用。

这意味着网络问题等暂时性错误可能导致应用永久不可用。

关于c# - 如何使用 Lazy 处理并发请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253903/

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