代码之家  ›  专栏  ›  技术社区  ›  James South

序列化时如何将文件锁定到线程?

  •  1
  • James South  · 技术社区  · 16 年前

    我正在构建一个通用的xml存储库,它使用datacontractserializer对文件进行序列化/反序列化,我不确定如何确保在读取文件时不能更改这些文件。

    我读取所有文件的代码如下:

       public IQueryable<T> All<T>() where T : class, new()
            {
                List<T> instances = new List<T>();
    
                DirectoryInfo datadirectory = new DirectoryInfo(this.storageLocation);
                if (datadirectory.Exists)
                {
                    foreach (FileInfo datafile in datadirectory.GetFiles("*.xml", SearchOption.TopDirectoryOnly))
                    {
                        lock (this.syncRoot)
                        {
                            instances.Add(this.converter.Build<T>(datafile.FullName));
                        }
                    }
                }
    
                return instances.AsQueryable();
            }
    

    我不确定的是把锁放在哪里?是应该如上所述,还是应该将DirectoryInfo包装为read?

    线程对我来说有点神秘,所以任何输入都将非常感谢。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Mikael Svenson    16 年前

    如果你的 converter.Build 读取整个文件,然后你就可以锁定 foreach

    如果在某些外部代码执行AsQueryable时以延迟方式(延迟执行)读取文件,则需要锁定调用代码。