我有这个:
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)
{
}
}