2014-09-17 6 views
2

Скажем, у меня есть Observable<LogEntry>, где LogEntry имеет свойство TimeStamp (среди прочего, конечно). 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")); 

    }); 
} 

Это наблюдаемое будет «срабатывать» так же быстро, как файл будет считан.

То, что я хочу в космосе (задержку) события по промежутку времени между вторым и последним последней LogEntry.TimeStamp

например. что-то вдоль линии

var replayObs = GetLogEntries().Delay(calculatedTimeDiff); 
+0

ли вы читать весь файл каждый раз, когда что-то записывается в файл? Производительность ухудшится довольно быстро ... – Dialecticus

+0

Нет, это просто для демонстрационной цели. Прежде чем «хвост» файла журнала производства, я хочу проверить мои вещи «в автономном режиме», следовательно, воспроизведение архивированного файла журнала. – codeclash

+0

Это действительно дубликат http://stackoverflow.com/questions/22255205/observable-from-list-of-timetamps/22256800#22256800 –

ответ

3

Создать регулярный перечислим над вашими файл журнала событий (которые могут быть ленивым или нет, как вы хотите), а затем посмотреть Observable from list of timetamps. Это практически дублирующий вопрос, поэтому я отметил его как таковой.

+0

И подумать, что я забыл все о 'Generate', даже если он меня укусил раньше:/У меня действительно проблемы с реактивными расширениями – samy

0

Я думаю, вам нужно комбинировать наблюдаемые и быть явным для всех вызовов, чтобы сделать это. Сначала предположим, что в logaterry содержится информация о времени. Я дам вам посмотреть, как рассчитать задержку до следующей записи, но теперь давайте предположим, что ваш логин содержит задержку напрямую. Хорошим способом найти его задержку было бы взять первую запись в лог-файл как относительную отправную точку.

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]) ; 

Что вам нужно сделать, это начать с созданием наблюдаемого толкая первые logentries вам нужно (скажем, в вашем случае, если вы хотите один из них; добавления второй один легко, увидеть Concat подписи)

var firstTwoLogEntries = 
    Observable.Concat( Observable.Return(logEntry1)); 

Тогда для каждой новой строки в файле, вы создаете новый LogEntry, что вы добавляете к наблюдаемому с ожидаемой задержкой :

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")); 
Смежные вопросы