我一直在使用.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會發生什麼?我認爲它不應該像這樣泄漏,但我仍然很好奇,看看會發生什麼 – 2012-01-31 05:34:29
謝謝@保羅,我已經添加了更多關於如何添加訂閱者的信息。 – 2012-01-31 16:23:10
我已經隔離了這個問題,但我還不知道解決方案。在循環中調用OnNext之前訂閱主題可防止內存泄漏。訂閱AFTER導致它。 – 2012-01-31 16:47:55