编程语言
首页 > 编程语言> > c# – 使用反应式编程写入打开FileStream

c# – 使用反应式编程写入打开FileStream

作者:互联网

我正在编写一个小的记录器,我想打开一次日志文件,在日志消息到达时继续写入,并在程序终止时处理所有内容.

我不确定如何保持FileStream打开并在消息到达时反应性地写入消息.

我想从我之前的解决方案更新设计,其中我有一个ConcurrentQueue充当缓冲区,并且在使用队列的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)));

标签:c,system-reactive,filestream,tpl-dataflow
来源: https://codeday.me/bug/20190522/1153736.html