我对失去活动的扩展计时器缺少什么?
我有这个:
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) { } }