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



我正在编写一个小记录器,我想一次打开日志文件,在日志消息到达时反应地写作,并在程序终止上处理所有内容。

我不确定如何保持文件流在到达时反应地写下消息。

我想从我以前的解决方案中更新设计的设计,该解决方案我的contrentqueue充当缓冲区,并且在using语句内部消耗了队列的循环。

具体来说,我想同时利用using语句构造,因此我不必明确关闭流和作者以及反应性无环编程样式。目前,我只知道如何一次使用以下构造之一: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?
            }
        }
    }

您需要使用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)));

相关内容

  • 没有找到相关文章

最新更新