C# 通过倒数第二个和倒数第二个之间的时间跨度可观察到的延迟
假设我有一个C# 通过倒数第二个和倒数第二个之间的时间跨度可观察到的延迟,c#,system.reactive,reactive-programming,C#,System.reactive,Reactive Programming,假设我有一个可观察的,其中日志条目有一个属性时间戳(当然还有其他属性)。LogEntrys是通过读取日志文件创建的 public IObservable<LogEntry> GetLogRecords() { return Observable.Create<LogEntry>( (IObserver<LogEntry> observer) => { var lines = File.ReadLines(this.
可观察的
,其中日志条目
有一个属性时间戳
(当然还有其他属性)。LogEntry
s是通过读取日志文件创建的
public IObservable<LogEntry> GetLogRecords()
{
return Observable.Create<LogEntry>(
(IObserver<LogEntry> observer) =>
{
var lines = File.ReadLines(this.filePath);
var enumerator = lines.GetEnumerator();
while (enumerator.MoveNext())
{
string line = enumerator.Current;
if (!line.StartsWith("#"))
{
var entry = new LogEntry(line);
observer.OnNext(entry);
}
}
observer.OnCompleted();
return Disposable.Create(() => Console.WriteLine("Unsubscribed"));
});
}
在日志文件事件上创建一个常规的可枚举项(可以是惰性的,也可以不是您想要的),然后查看。这实际上是一个重复的问题,因此我将其标记为重复问题。我认为您必须将可观察值组合起来,并对所有调用进行显式处理。首先,假设日志条目包含一些时间信息。我将让您了解如何计算到下一个条目的延迟,但是现在让我们假设您的日志条目直接包含延迟。找到延迟的一个好方法是将日志文件的第一个条目作为一个相对的起点
public class LogEntry
{
public int delay { get; set; }
}
public static LogEntry readLogEntryFromLine(string line)
{
return new LogEntry() {delay = Int32.Parse(line)};
}
我们设置了一些数据
var lines = new string[] {"0","1","1","2","3","7"};
// this would be the lines you read from the file
var logEntry1 = readLogEntryFromLine(lines[0]) ;
您需要做的是,首先创建一个可观察的日志项,推送您需要的第一个日志项(假设您需要其中一个日志项;添加第二个日志项很容易,请参见Concat
签名)
然后,为文件中的每一行创建一个新的日志条目,并以预期的延迟将其添加到observable中:
var finalObservable = firstTwoLogEntries;
var delayOfLatestLogEntry = logEntry1.delay;
foreach (var line in lines.Skip(1)) // we skip the filrst logentry that is our reference
{
var logEntry = readLogEntryFromLine(line);
finalObservable = Observable.Concat(finalObservable, Observable.Return(logEntry).Delay(TimeSpan.FromSeconds(delayOfLatestLogEntry)));
delayOfLatestLogEntry = logEntry.delay;
}
最后,你的可观察到的
finalObservable.Subscribe((le) => Console.WriteLine("log event at " + DateTime.Now + " - next one in " + le.delay + " seconds"));
您是否在每次向文件写入内容时都读取整个文件?性能会很快下降…不,那只是为了演示。在“跟踪”一个生产日志文件之前,我想“离线”测试我的东西,从而重放一个存档的日志文件。这实际上是一个副本,我想我忘记了所有关于
Generate
,即使它以前咬了我一口:/我确实在思考被动扩展时遇到了问题
var finalObservable = firstTwoLogEntries;
var delayOfLatestLogEntry = logEntry1.delay;
foreach (var line in lines.Skip(1)) // we skip the filrst logentry that is our reference
{
var logEntry = readLogEntryFromLine(line);
finalObservable = Observable.Concat(finalObservable, Observable.Return(logEntry).Delay(TimeSpan.FromSeconds(delayOfLatestLogEntry)));
delayOfLatestLogEntry = logEntry.delay;
}
finalObservable.Subscribe((le) => Console.WriteLine("log event at " + DateTime.Now + " - next one in " + le.delay + " seconds"));