Чтение дважды из FileStream
У меня есть метод GetServiceMap(), который вызывает десериализатор, который затем открывает поток и читает что-то из него.
Проблема в том, что у меня есть метод GetAllGroups(), который также вызывает десериализатор через тот же поток.
Как бы это синхронизировать? С ManualResetEvent может быть?
public ServiceMapModel GetServiceMap()
{
s._mre.WaitOne();
return s.Deserialize();
}
public List<Group> GetAllGroups()
{
s._mre.WaitOne();
return s.Deserialize().Groups;
}
Метод десериализации:
public ManualResetEvent _mre = new ManualResetEvent(true);
public ServiceMapModel Deserialize()
{
_serviceMap = new ServiceMapModel();
_mre.Reset();
try
{
using (var fileStream = new FileStream(Settings.Path, FileMode.Open))
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
using (XmlReader reader = XmlReader.Create(fileStream, settings))
{
_serviceMap = _serializer.Deserialize(reader) as ServiceMapModel;
}
fileStream.Close();
}
}
catch (IOException)
{
}
_mre.Set();
return _serviceMap;
}
1 ответ
Решение
Для вашего случая достаточно простой блокировки - нет причин использовать более сложные объекты.
Я бы на самом деле кэшировал результат десериализации вместо чтения из файла каждый раз, но это ваш вызов.