我对失去活动的扩展计时器缺少什么?

我有这个:

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发布时,根据给定的开始时间和间隔ping Web服务(通过CheckFolder()方法)。

麻烦的是,每次运行程序时,它都会为第一个Watcher输出一条消息,然后程序退出而不会出错。 它得到了第一个答案,它已经完成了。

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

我几乎是肯定的,我不是以正确的方式提出这个问题,但希望一些反馈可以帮助我改进我的问题。

谢谢。

这很可能是因为Subscribe是一种非阻塞调用。 即如果你有的话;

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

您可能会发现它什么都不打印(或者可能是“得0”,具体取决于您的PC感觉)

如果您停止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) { } }