2012-03-14 33 views
1

私はストリームを開いて何かを読み込むdeserializerを呼び出すGetServiceMap()メソッドを持っています。FileStreamから2回読み込み

問題は、同じストリームでデシリアライザを呼び出す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; 
    } 
+0

私の編集内容が正しいかどうかを確認してください - あなたの質問に「ファイルからの非同期読み取り」がありません。 –

+0

はい、そうです。 tnx。 – Bip

答えて

2

基本lockは十分にあってはならない - より複雑なオブジェクトを使用する理由。

私は実際に毎回ファイルから読み込むのではなく、逆シリアル化の結果をキャッシュしますが、あなたの呼び出しです。

+0

どのようにキャッシュしますか?少しのコードをお願いしますか? :)私は、あなたが実際にメモリストリームにファイル全体をロードし、それから書き込み/読み込むことを提案します。それをファイルに保存する適切な瞬間はいつですか? :) – Bip

+1

'private ServiceMapModel cache;'それに戻り値を代入し、ファイルから読み返す代わりにキャッシュされた値を使用する – zapl

関連する問題