Я пытаюсь убедиться, что экземпляры класса, использующие Rx
, не пропускают. Я сократил проблему до самого необходимого, и похоже, что функция Window является ключом к решению проблемы.
Примите во внимание следующее:
<!-- language: c# -->
using System;
using System.Reactive.Linq;
class Program
{
static void Main(string[] args)
{
var foo = new Foo();
Console.WriteLine("Press any key...");
Console.ReadKey(true);
foo = null;
GC.Collect();
Console.WriteLine("Press any key...");
Console.ReadKey(true);
}
}
public class Foo
{
private event EventHandler MyEvent;
public Foo()
{
var subs = Observable.FromEventPattern(
e => MyEvent += e, e => MyEvent -= e);
// (1) foo is never GC'd
subs.Window(TimeSpan.FromSeconds(1)).Subscribe();
// (2) foo is GC'd
//subs.Window(TimeSpan.FromSeconds(1));
// (3) foo is GC'd
// subs.Window(1);
}
~Foo()
{
Console.WriteLine("Bye!");
}
}
Когда я применяю функцию Window с селектором открытия TimeSpan и подписываюсь на него, (1) foo никогда не будет GC'd.
Если я не подпишусь (2) или использую другой открывающий селектор (3), тогда это так.
Кроме того, если я использую наблюдаемую холодность в качестве источника, то foo независимо от GC.
Почему функция Window со специальным TimeSpan, и как я могу убедиться, что foo будет GC'd при его использовании?