C# 使用MemoryCache而不是ConccurentDictionary的常见模式是什么?

C# 使用MemoryCache而不是ConccurentDictionary的常见模式是什么?,c#,dictionary,memorycache,C#,Dictionary,Memorycache,我的代码通过等待已经运行的操作的结果来处理并发请求。数据请求可能与相同/不同的凭据(包括空凭据)同时传入 对于每一组唯一的凭据,最多可以有一个GetDataInternal调用正在进行,当一个调用准备就绪时,该调用的结果将返回给所有排队的等待者 private static readonly Credentials EmptyCredentials = new Credentials { SqlCredentials = null, ExchangeCredentials =

我的代码通过等待已经运行的操作的结果来处理并发请求。数据请求可能与相同/不同的凭据(包括空凭据)同时传入

对于每一组唯一的凭据,最多可以有一个GetDataInternal调用正在进行,当一个调用准备就绪时,该调用的结果将返回给所有排队的等待者

private static readonly Credentials EmptyCredentials = 
new Credentials
{
    SqlCredentials = null,
    ExchangeCredentials = null
}; // added it to avoid ArgumentNullException inside GetOrAdd if Credentials == null

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

public Data GetData(Credentials credential)
{
    Lazy<Data> data = new Lazy<Data>(() => GetDataInternal(credential));
    Lazy<Data> lazyData = Cache.GetOrAdd(credential ?? EmptyCredentials, data);

    bool isAdded = ReferenceEquals(data, lazyData); 

    try
    {
       return lazyData.Value;
    }
    finally
    {
       if (isAdded)
       {
            Cache.TryRemove(credential ?? EmptyCredentials, out lazyData);
        }
    }
}
通过使用MemoryCache

Lazy<Data> lazyData = (Lazy<Data>)MemoryCache.Default.AddOrGetExisting(..., data, 
                                                                    new CacheItemPolicy());
Lazy lazyData=(Lazy)MemoryCache.Default.AddOrGetExisting(…,data,
新的CacheItemPolicy());

那么,我如何才能得到我的键值呢?

看看下面的解决方案,但我不确定它是否正确

public Data GetData(Credentials credential)
{
   var data = new Lazy<Data>(() => GetCurrentInternal(credential));
   var lazydata  = (Lazy<Data>)MemoryCache.Default.AddOrGetExisting(
                   (credential ?? EmptyMetadataCredentials).ToString(),
                    data,
                    DateTime.Now.AddMinutes(5));

    return (lazydata ?? data).Value;
}
公共数据获取数据(凭证凭证)
{
var data=newlazy(()=>GetCurrentInternal(凭证));
var lazydata=(Lazy)MemoryCache.Default.AddOrGetExisting(
(凭证??EmptyMetadataCredentials).ToString(),
数据,
DateTime.Now.AddMinutes(5));
返回值(lazydata??data).Value;
}
public Data GetData(Credentials credential)
{
   var data = new Lazy<Data>(() => GetCurrentInternal(credential));
   var lazydata  = (Lazy<Data>)MemoryCache.Default.AddOrGetExisting(
                   (credential ?? EmptyMetadataCredentials).ToString(),
                    data,
                    DateTime.Now.AddMinutes(5));

    return (lazydata ?? data).Value;
}