0

我在 SO 和其他网站上阅读了很多关于缓存和线程同步的内容,但我仍然无法回答我的问题。

用于静态字典缓存的 .NET 线程安全

锁是如何工作的?

为什么要对单独的对象执行锁定?

http://msdn.microsoft.com/en-us/magazine/cc188793.aspx

...

我正在尝试实现一个缓存,该缓存公开只能从外部读取的资源。这些资源可以更新,但不会经常更新,也不会花费太多时间。

基本上,资源是键值列表(id 和字符串)并且不是很大(一百个元素不多)。

因此,我不想在 read 方法上加锁以避免同步开销,因为它在大多数情况下都不是必需的,但我想在需要更新资源时使用它。

我的问题是:有没有办法做这样的事情:

public class AFTypeCache<T> where T : class
{
   private Dictionary<int, T> _types;
   private Func<Dictionary<int, T>> _dataProvider;
   private readonly object _sync = new object();

   public void UpdateData()
   {
       // here something (?) to make sure no more threads are reading the resource
       lock (_sync)
       {
           _types = _dataProvider();
       }
   }

   public IEnumerable<int, T> Get()
   {
       // thought about something like that but I'm pretty sure this won't work...
       if (_updating)
       {
           lock
           {
                return _types;
           }
       }
       else
       {
           // I know not the way to get enumerator but that's not the point
           return _types;
       }
   }
}

另外,尝试实现这一点真的有用吗,还是我走错了路,应该在Get方法中使用锁?

编辑:

好的,经过更多的谷歌搜索,我会有一个更精确的问题:是否有可能知道其他线程是否正在使用类引用,如果是,请等待该线程完成使用它?

4

1 回答 1

0

我错过了什么或者你正在尝试创建一个并发字典?如果是这样,为什么不使用框架一?( http://msdn.microsoft.com/en-us/library/dd287191.aspx )

你可以用并发字典(或者你自己的版本)来解决你的问题,使用线程ID和类名作为键,值是一个布尔值,表示线程中类的使用.

但我也看不出这样做的任何理由,并发字典已经存在于框架中。

于 2013-03-29T10:30:43.247 回答