【发布时间】:2018-08-12 00:19:29
【问题描述】:
我创建了基于 Rx 间隔的简单触发器。它会在每个特定间隔生成信号,并通过 Where 方法过滤,如下所示(简化示例):
var isActive = false;
Observable.Interval(TimeSpan.FromMilliseconds(1))
.Where(_ => !isActive)
.Subscribe(_ =>
{
isActive = true;
Console.WriteLine("New subscription item");
Thread.Sleep(30 * 1000); // simulate time-expensive work
Console.WriteLine("Finished");
isActive = false;
});
当 isActive 标志设置为 true 时,我想忽略元素。它似乎有效,因为每 30 秒调用一次订阅块(模拟耗时的工作),但是当我分析这样简单的应用程序时,我看到许多 Action 对象存储在内存中(每秒约 60-70 个实例)并在它们被处理时正在被订阅块消耗。我想忽略并立即处理它们。
【问题讨论】:
-
请记住,Windows 无法每 1 毫秒运行一次计时器。它可以做的最好的事情是大约 16 毫秒(从内存中)。现在 1000 毫秒 / 16 毫秒 = 62.5。这可能解释了您获得的 60 到 70 个实例。
-
尝试在
.Interval之后拨打.Synchronize()电话,看看问题是否会消失。 -
你确定有内存泄漏吗?当然,这些可观察对象将很快连续创建,导致大量开销,但当过滤器丢弃它们时,它们应该被垃圾回收。
标签: c# memory-leaks where system.reactive