2012-03-14 80 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