c# - 静态缓存错误

标签 c# caching asp.net-2.0

我有一个静态缓存,它会在设定的时间更新数据库中的通用对象列表。

这只是一个简单的静态列表:

private static List<myObject> _myObject;

public List<myObject> FillMyObject()
{
     if(_myObject == null || myTimer)
      _myObject = getfromDataBase();
}

我有 2 个方法来更新我的对象,称为 UpdateMyObjectRemoveAnEntryFromMyObject

一切似乎都运行良好,但每个人偶尔都会遇到大量错误。然后它消失了,看起来又好了。有谁知道发生了什么事吗?

最佳答案

您需要使用lock每当您访问或更新静态缓存时都要声明。 lock 语句将阻止其他线程执行,直到它完成。如果您不这样做,则可能会有一个线程尝试循环遍历集合,同时另一个线程正在删除一行。根据您的具体情况,您可能需要使用 double check locking

    static readonly object lockObj = new object();
    private static List<myObject> _myObject;

     public List<myObject> FillMyObject()
     {
         lock (lockObj)
         {
            if(_myObject == null || myTimer)
               _myObject = getfromDataBase();
         }
     }


     public List<myObject> UpdateMyObject(somevalue)
     {
        lock (lockObj)
         {
            _myObject.RemoveAll(delegate(myObject o)
                                {
                                    return o.somevalue == somevalue;
                                 });)
         }
     }

Further Reading

关于c# - 静态缓存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1608129/

相关文章:

javascript - jQuery、insertBefore、验证、错误消息的放置

asp.net-2.0 - 调用ScriptManager.RegisterStartupScript时, 'Type'参数有什么意义?

asp.net-2.0 - 如何在生产环境中删除临时 ASP.net 文件?

C# 匹配内存数据中的固定属性

c# - 是否存在子类保证它将调用某些方法的模式?

c# - 使用 C#/Mono 更改 Ubuntu 上的当前时区

java - Google Guava Cache,刷新过期超时

android - 我如何利用 Android 的 "Clear Cache"按钮

c# - 将形状添加到新的 Visio 文档

iOS App离线和同步