代码之家  ›  专栏  ›  技术社区  ›  heltonbiker

使用反应式编程写入打开文件流

  •  5
  • heltonbiker  · 技术社区  · 7 年前

    我正在编写一个小的日志程序,我想打开日志文件一次,在日志消息到达时保持反应性写入,并在程序终止时处理所有内容。

    当消息到达时,反应性地写下消息。

    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?
                }
            }
        }
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   heltonbiker    7 年前

    你需要使用 Observable.Using 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)));