Как заблокировать файл в потоке при сериализации? - PullRequest
1 голос
/ 06 сентября 2010

Я создаю общий 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();
        }

Где преобразователь - сериализатор, а syncRoot - частный объект.

В чем я не уверен, так это где поставить замок? Должно ли это быть так, как указано выше, или я должен обернуть чтение DirectoryInfo?

Я бы хотел иметь возможность распараллелить процесс чтения с использованием parallel.foreach, но ранние эксперименты с обертыванием DirectoryInfo привели к исключениям.

Потоки - это немного загадка для меня, поэтому любая информация будет принята с благодарностью.

Заранее спасибо.

1 Ответ

1 голос
/ 06 сентября 2010

Если ваш converter.Build читает весь файл, то вы можете заблокировать foreach, чтобы другие потоки в вашей программе не могли записывать эти файлы.Чтобы предотвратить запись других процессов, вам нужно открыть FileStreams с монопольным доступом на чтение, как упомянуто Хенком.

Если вы читаете файлы лениво (отложенное выполнение), когда AsQueryable выполняется некоторым внешним кодом, затем вам нужно заблокировать вызывающий код.

...