2017-09-04 13 views
4

私は小さなロガーを作成しています。ログファイルを一度開き、ログメッセージが到着するのを待って書き込み続け、プログラムの終了時にすべてを破棄します。リアクティブプログラミングを使用してFileStreamを開くために書き込む

私は、彼らが到着した反動メッセージを書き込む開いたFileStreamを保つことができるかどうかはわかりませんよ。

私はバッファとして動作するConcurrentQueueと、キューを消費したusingステートメント内のループを持つ以前のソリューションから設計を更新したいと考えています。

具体的には、私は同時にusingステートメント構成を活用にしたいので、私は明示的にストリームとライターを閉じる必要はありませんし、反応性、ループレスプログラミングスタイルの。現在のところ、私はこれらのコンストラクトのどれかを一度に使用する方法しか知りません:using /ループの組み合わせか、明示的なストリームクローズ/リアクティブの組み合わせです。あなたはObservable.Usingを使用する必要が

BufferBlock<LogEntry> _buffer = new BufferBlock<LogEntry>(); 


    // CONSTRUCTOR 
    public DefaultLogger(string folder) 
    { 
     var filePath = Path.Combine(folder, $"{DateTime.Now.ToString("yyyy.MM.dd")}.log"); 

     _cancellation = new CancellationTokenSource(); 

     var observable = _buffer.AsObservable(); 

     using (var stream = File.Create(_filePath)) 
     using (var writer = new StreamWriter(stream)) 
     using (var subscription = observable.Subscribe(entry => 
            writer.Write(GetFormattedString(entry)))) 
     { 
      while (!_cancellation.IsCancellationRequested) 
      { 
       // what do I do here? 
      } 
     } 
    } 

答えて

3

は、ここに私のコードです。シーケンスが終了するときに廃棄されるリソースIDisposbleを作成するように設計されています。

このような何か試してみてください:

IDisposable subscription = 
    Observable.Using(() => File.Create(_filePath), 
     stream => Observable.Using(() => new StreamWriter(stream), 
      writer => _buffer.AsObservable().Select(entry => new { entry, writer }))) 
     .Subscribe(x => x.writer.Write(GetFormattedString(x.entry))); 
関連する問題