2012-03-14 78 views
1

我有一个GetServiceMap()方法,它调用反序列化程序,然后打开该流并从中读取某些内容。从FileStream读取两次

问题是,我有一个GetAllGroups()方法也通过相同的流调用解串器。

我该如何syncronize它?用ManualResetEvent也许?

public ServiceMapModel GetServiceMap() 
    { 
     s._mre.WaitOne(); 
     return s.Deserialize(); 
    } 

public List<Group> GetAllGroups() 
    { 
     s._mre.WaitOne(); 
     return s.Deserialize().Groups; 
    } 

Deserialize方法:

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; 
    } 
+0

请看我的编辑是否有意义 - 在你的问题中没有“异步读取文件”。 – 2012-03-15 00:08:07

+0

是的,它使。 TNX。 – Bip 2012-03-15 00:11:07

回答

2

对于你的情况基本lock应该是不够的 - 没有理由使用更复杂的对象。

我实际上会缓存反序列化的结果,而不是每次都从文件中读取,但这是您的调用。

+0

你会如何缓存它?你能提供一些代码吗? :)我的意思是,你建议实际上将整个文件加载到内存流,然后写入/读取它。什么时候将是保存文件的合适时机? :) – Bip 2012-03-15 00:23:16

+1

'私人ServiceMapModel缓存;'然后分配返回值,并使用缓存的值,而不是从文件重读 – zapl 2012-03-15 00:49:12