.NET Reactive Extensions를 사용하여 로그 이벤트를 관찰했습니다. 현재 IObservable에서 파생 된 클래스를 사용하고 ReplaySubject를 사용하여 로그를 저장합니다. 그런 식으로 로그를 필터링하고 재생할 수 있습니다 (예 : 모든 오류 로그 표시 또는 모든 자세한 로그 표시). 버퍼링 한 로그를 손실하지 않습니다..NET Rx - ReplaySubject 버퍼 크기가 작동하지 않습니다.
문제는 그 주제에 버퍼 크기를 설정 한 경우에도입니다 :
this.subject = new ReplaySubject<LogEvent>(10);
내가에 관찰 컬렉션에 추가 할 OnNext를 사용할 때 내 프로그램의 메모리 사용량이 지붕을 통해서 간다 무한 루프 :
internal void WatchForNewEvents()
{
Task.Factory.StartNew(() =>
{
while (true)
{
dynamic parameters = new ExpandoObject();
// TODO: Add parameters for getting specific log events
if (this.logEventRepository.GetManyHasNewResults(parameters))
{
foreach (var recentEvent in this.logEventRepository.GetMany(parameters))
{
this.subject.OnNext(recentEvent);
}
}
// Commented this out for now to really see the memory go up
// Thread.Sleep(1000);
}
});
}
ReplaySubject의 버퍼 크기가 작동하지 않습니까? 버퍼 크기에 도달하면 버퍼를 지우지 않는 것 같습니다. 도움이 많이 감사!
UPDATE :
나는 추가 같은 가입자 (이 잘못인가?) :
처럼라고public IDisposable Subscribe(IObserver<LogEvent> observer)
{
return this.subject.Subscribe(observer);
}
... :
// Inserts into UI ListView
this.logEventObservable.Subscribe(evt => this.InsertNewLogEvent(evt));
ReplaySubject에 구독자를 추가하면 어떻게됩니까? 나는 이것이 누설해서는 안된다 고 생각하지만, 여전히 무슨 일이 일어나고 있는지 궁금하다. –
감사합니다. 폴. 구독자를 추가하는 방법에 대한 자세한 정보를 추가했습니다. –
아직 해결 방법을 모르지만 문제를 격리했습니다. 루프에서 OnNext를 호출하기 전에 제목을 구독하면 메모리 누수가 방지됩니다. 구독 후에 AFTER가 발생합니다. –