我错过了什么关于反应式延长定时器



我有这个:

watchers
  .ToObservable() // needs to be observable
  .SelectMany(watcher =>         // working on each watcher
    Observable
      // create a timer for the watcher
      .Timer(watcher.StartTime, TimeSpan.FromHours(watcher.Interval))  
      .SelectMany(Observable.FromAsync(
        async () => new { watcher, result = await CheckFolder(watcher.Path) }))) 
  .Subscribe(x => Console.WriteLine(string.Format("Watcher: {0}tResult: {1}tTime: {2}", x.watcher.Name, x.result, DateTimeOffset.Now))); // tell everyone what happened.

这是这篇文章中的一个很好的小代码,让我开始了这条路。目标是在每次发布Timer时,根据给定的开始时间和间隔,对web服务进行ping(通过CheckFolder()方法)。

问题是,每次我运行程序时,它都会为第一个Watcher输出一条消息,然后程序就会毫无错误地退出。它得到了第一个答案,它就完成了。

如何让它等待所有计时器的其他出版物?

我几乎肯定我问这个问题的方式不对,但希望一点反馈能帮助我完善我的问题。

谢谢。

这可能是因为Subscribe是一个非阻塞调用。也就是说,如果你有;

static void Main(string[] args)
{
  Observable.Timer(DateTimeOffset.Now, TimeSpan.FromSeconds(0.5))
            .Subscribe(x => Console.WriteLine("Got " + x));
}

你可能会发现它什么都不打印(或者可能"得了0",这取决于你的电脑的感觉)

如果您通过等待按键来阻止Main退出,如下图所示:

static void Main(string[] args)
{
    Observable.Timer(DateTimeOffset.Now, TimeSpan.FromSeconds(0.5))
               .Subscribe(x => Console.WriteLine("Got " + x));
    Console.ReadKey();
}

然后,它应该一直打印出值,直到你按下一个键。

需要记住的是,有一个激活的订阅不足以让你的程序运行。如果你正在编写一个带有一些UI的应用程序,那么你通常会有一个消息循环——这将使你的程序在关闭窗口之前一直处于活动状态。但控制台应用程序的情况并非如此,一旦你到达main的末尾,你的程序就结束了。

因此,你需要找到一种方法来避免你的应用程序在阅读之前退出。等待按下一个特定的键是一种常见的方法,所以这可能对你有用。例如

static void Main(string[] args)
{
    Observable.Timer(DateTimeOffset.Now, TimeSpan.FromSeconds(0.5))
              .Subscribe(x => Console.WriteLine("Got " + x));
    while (Console.ReadKey().Key != ConsoleKey.Q)
    {
    }
}

相关内容

  • 没有找到相关文章

最新更新