Console.WriteLine(state)); testSc-6ren">
gpt4 book ai didi

c# - Rx .Net TestScheduler - 立即执行计划的事件

转载 作者:行者123 更新时间:2023-12-01 23:44:40 31 4
gpt4 key购买 nike

当我这样做时:

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 为 true,我退出该方法。

我可以调用 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:

它通常会在适当的时间执行。例如,此代码将写入控制台:

var scheduler = new TestScheduler();

scheduler.Schedule(
TimeSpan.FromTicks(100),
() => Console.WriteLine("Hello"));

scheduler.AdvanceTo(100);

但是,TestScheduler 只会在时间移动时检查其队列。因此,如果您安排一个操作,则需要通过 AdvanceByAdvanceToStart 移动时间以使其处理队列。当它完成时,它将处理当前时间之前的所有内容。例如。尽管“过去”安排,但即使这样也会输出到控制台:

var scheduler = new TestScheduler();

scheduler.AdvanceTo(TimeSpan.FromTicks(100).Ticks);

scheduler.Schedule(
DateTime.MinValue + TimeSpan.FromTicks(50),
() => Console.WriteLine("Hello"));

Console.WriteLine("No output until the scheduler is given time...");
scheduler.AdvanceBy(1);

TestScheduler 的惯用用法通常包括将所有工作排队,然后通过 Start() 调用运行完成,然后检查预期状态。使用 AdvanceByAdvanceTo 往往适用于要求更高的测试场景,您需要测试一些中间状态 - 即便如此,您通常也会对所有内容进行排队首先指定适当的截止时间,然后使用 AdvanceByAdvanceTo 您感兴趣的时间,检查状态,然后再次使用 AdvanceBy AdvanceTo开始

您通常不想做的事情是排队工作,运行一点,排队更多工作,运行一点 - 特别是如果您在没有规定时间的情况下进行安排。然后你就会遇到这里的问题。

这并不是说在您的特定场景中这可能是不可避免的 - 例如,如果您需要决定在特定时间之后安排什么 - 但请考虑您是否可以提前设置所有内容,因为这可能会导致更干净的测试代码,更严格地遵循排列行为断言模式。

我尝试通过调度进行安排,然后通过移动时间进行操作,然后断言结果。

关于c# - Rx .Net TestScheduler - 立即执行计划的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16896152/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com