以下方法通过等待已运行操作的结果来处理并发请求。
对数据的请求可能会使用相同/不同的凭据同时出现。对于每组唯一的凭据,最多可以有一个GetCurrentInternal
呼叫正在进行中,当准备就绪时,该呼叫的结果将返回给所有排队的服务员。
private readonly ConcurrentDictionary<Credentials, Lazy<Data>> _dataToCredentialMap =
new ConcurrentDictionary<Credentials, Lazy<Data>>();
public virtual Data GetCurrent(Credentials credentials)
{
if (credentials == null) { return GetCurrentInternal(null); }
// It will only allow a single call to GetCurrentInternal, even if multiple threads query its Value property simultaneously.
var lazyData = new Lazy<Data>(() => GetCurrentInternal(credentials));
var data = _dataToCredentialMap.GetOrAdd(credentials, lazyData);
return data.Value;
}
我已经添加了timer
在构造函数中的此类内部。它是基于时间的失效策略,其中缓存条目在特定的明确定义的时间段后自动失效。
_dataUpdateTimer = new Timer(UpdateData, null, TimeSpan.Zero, _dataUpdateInterval); // 1 min
更新数据的方法如下所示:
private void UpdateData(object notUsed)
{
try
{
foreach (var credential in _dataToCredentialMap.Keys)
{
var data = new Lazy<Data>(() => GetCurrent(credential));
_dataToCredentialMap.AddOrUpdate(credential, data, (k, v) => data);
}
}
catch (Exception ex)
{
_logger.WarnException(ex, "Failed to update agent metadata");
}
}
我想使用.NetMemoryCache
类而不是我的ConcurrentDictionary
and Timer
,更新我的Credential and Data
我认为这会更有效率。
我知道如何使用MemoryCache
代替ConcurrentDictionary
,但我怎样才能打电话UpdateData
构造函数中的每一分钟都没有Timer
?
你能帮我看看该怎么做吗?