【发布时间】:2022-01-18 03:12:30
【问题描述】:
当我这样做时:
testScheduler.Schedule("Hello world",(scheduler, state) => Console.WriteLine(state));
testScheduler.AdvanceTo(testScheduler.Now);
我在VirtualTimeSchedulerBase打了这个代码:
public void AdvanceTo(TAbsolute time)
{
int num = this.Comparer.Compare(time, this.Clock);
if (num < 0)
throw new ArgumentOutOfRangeException("time");
if (num == 0)
return;
num == 0 为真,我退出该方法。
我可以致电testScheduler.Start(),我的操作将执行。但随后TestScheduler 将继续执行其队列中的所有内容。而我希望它在当前时间停止执行操作。
我在 TestScheduler 上看不到任何其他可以得到我想要的行为的方法。
这是一个错误,还是正确的行为但我遗漏了什么?
编辑:
我误会了。 TestScheduler 直到在计划日期之后才执行操作。
调度一个动作会立即将其调度为testScheduler.Now 的当前值。所以直到Now + 1才会执行。
var testScheduler = new TestScheduler();
var due = new DateTime();
testScheduler.Schedule("Hello world", due, (scheduler, s) =>
{
Console.WriteLine(s);
return Disposable.Empty;
});
testScheduler.AdvanceTo(due.Ticks);
// Nothing has happened
testScheduler.AdvanceTo(due.Ticks+1);
// -> "Hello world"
这仍然不是我想要的行为,但你去吧。
【问题讨论】:
-
"调度一个动作会立即将它调度为 testScheduler.Now 的当前值。所以它不会在 Now + 1 之前执行。" - 不,这是错误的 - 它为 Clock + 1 安排。它仅在您前进时执行,因为那是您给 TestScheduler 一个时间片来处理它的队列的时候。
标签: c# .net system.reactive