Проблема, с которой вы сталкиваетесь, заключается в том, что как только ваш поток попадает в цикл while (true)
, он перехватывается и никогда не может закончиться. В .Dispose()
нет ничего волшебного, что остановит поток.
На самом деле одноразовый материал уже утилизируется до того, как вы позвоните .Dispose()
. Поскольку вы использовали перегрузку .Schedule
, которая запускается только после удаления подписки сразу после запуска кода.
Что вам нужно сделать, так это использовать перегрузку, которая поддерживает перепланирование. К счастью, там уже есть один. Попробуйте этот код:
IDisposable myDisposable = Scheduler.Default.Schedule(0, TimeSpan.Zero, (count, reschedule) =>
{
Console.WriteLine(count);
reschedule(count + 1, TimeSpan.FromSeconds(0.5));
});
Это работает именно так, как вы хотите - он правильно располагает.
Теперь, сказав, что вы работаете с Rx, вы можете просто использовать стандартные наблюдаемые операторы. Это тоже работает:
IDisposable myDisposable =
Observable
.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(0.5))
.Subscribe(count => Console.WriteLine(count));
Simple.