如何使用 MemoryCache 代替 Timer 来触发方法?
How to use MemoryCache insted of Timer to trigger a method?
以下方法通过等待已经 运行 操作的结果来处理并发请求。
数据请求可能会与 same/different 凭据同时出现。对于每组唯一的凭据,最多可以有一个 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;
}
并且我在构造函数中的 class 中添加了 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");
}
}
我想使用 .Net MemoryCache
class 代替我的 ConcurrentDictionary
和 Timer
,来更新我的 Credential and Data
我想它会是更有效率。
我知道如何使用 MemoryCache
而不是 ConcurrentDictionary
,但是如何在没有 Timer
的构造函数中每分钟调用 UpdateData
?
你能帮我看看怎么做吗?
您可以在没有计时器的情况下使用 MemoryCache 执行此操作。只需将 CacheItemPolicy 设置为 AbsoluteExpiration:
MemoryCache memCache = MemoryCache.Default;
memCache.Add(<mykey>, <myvalue>,
new CacheItemPolicy()
{
AbsoluteExpiration = DateTimeOffset.Now.Add(TimeSpan.FromMinutes(_expireminutes)),
SlidingExpiration = new TimeSpan(0, 0, 0)
}
);
以下方法通过等待已经 运行 操作的结果来处理并发请求。
数据请求可能会与 same/different 凭据同时出现。对于每组唯一的凭据,最多可以有一个 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;
}
并且我在构造函数中的 class 中添加了 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");
}
}
我想使用 .Net MemoryCache
class 代替我的 ConcurrentDictionary
和 Timer
,来更新我的 Credential and Data
我想它会是更有效率。
我知道如何使用 MemoryCache
而不是 ConcurrentDictionary
,但是如何在没有 Timer
的构造函数中每分钟调用 UpdateData
?
你能帮我看看怎么做吗?
您可以在没有计时器的情况下使用 MemoryCache 执行此操作。只需将 CacheItemPolicy 设置为 AbsoluteExpiration:
MemoryCache memCache = MemoryCache.Default;
memCache.Add(<mykey>, <myvalue>,
new CacheItemPolicy()
{
AbsoluteExpiration = DateTimeOffset.Now.Add(TimeSpan.FromMinutes(_expireminutes)),
SlidingExpiration = new TimeSpan(0, 0, 0)
}
);