gpt4 book ai didi

c# - 使用响应式(Reactive)编程写入打开 FileStream

转载 作者:太空狗 更新时间:2023-10-29 23:20:18 25 4
gpt4 key购买 nike

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

我不确定如何让 FileStream 保持打开状态在消息到达时 react 性地写入它们。

我想更新我以前的解决方案的设计,在该解决方案中,我有一个 ConcurrentQueue 充当缓冲区,并且 using 语句中有一个循环消耗队列。

具体来说,我想同时利用using语句构造,所以我不必显式关闭流和编写器,以及响应式(Reactive),无循环编程风格。目前我只知道如何一次使用这些构造之一:using/loop 组合,或 explicit-stream-close/reactive 组合。

这是我的代码:

    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# - 使用响应式(Reactive)编程写入打开 FileStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46043905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com