2017-09-04 1 views
4

작은 로거를 작성 중이며 로그 파일을 한 번 열어서 로그 메시지가 도착하면 응답을 계속 작성하고 프로그램 종료시 모든 내용을 처리하려고합니다.반응 프로그래밍을 사용하여 FileStream을 열어 쓰기 위해 작성

FileStream을 열린 상태로 유지할 수있는 방법이 확실하지 않습니다. 메시지가 도착하면 반응적으로 작성합니다.

큐를 사용하는 using 문 내부의 루프와 버퍼로 동작하는 ConcurrentQueue가있는 이전 솔루션에서 디자인을 업데이트하고 싶습니다.

특히, 나는 동시에using 문 구조를 활용 원하는, 그래서 명시 적으로 스트림과 작가를 닫습니다하지 않으며, 반응, loopless 프로그래밍 스타일의. 현재 나는 한 번에 이러한 구조 중 하나를 사용하는 방법을 알고 있습니다 : 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))); 
관련 문제