我正在尝试创建与第三方API的连接池,并且如果不使用连接,则连接将在一定间隔后过期。它们到期后,需要通过第三方API断开连接。

看来MemoryCache(System.Runtime.Caching)将处理此问题。不过,UpdateCallback的行为似乎很奇怪。

一个简单的LINQPad示例:

void Main()
{
    var cache = MemoryCache.Default;
    var policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(1);
    policy.UpdateCallback = Update;
    cache.Set("figkey", "fig", policy);

    Thread.Sleep(2000);

    object result = cache.Get("figkey");

    Console.WriteLine(result == null ? "null" : result);
}

public static void Update(CacheEntryUpdateArguments arguments)
{
    Console.WriteLine("got here");
}

如果运行此命令,则输出为:
fig

它不会而不是输出“此处获得”。

如果我注释掉以policy.UpdateCallback开头的行,则输出为:
null

我究竟做错了什么?

如果有更好的方法来完成任务,我可以提出其他建议。

最佳答案

我认为问题可能出在Thread.Sleep上,因为这也阻止了缓存,因为它们在同一线程中运行。如果尝试进行虚拟循环,则将触发更新处理程序:

var i = 0;
for (var j = 0; j < 10000000; j++)
{
    for (var k = 0; k < 1000000; k++)
        i++;
    i--;
}
Console.WriteLine(i);

而不是 sleep 。

关于c# - MemoryCache UpdateCallback无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9650614/

10-10 13:04