我有这个:
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.
来自this post的一小段代码让我开始走这条路。目标是每次CheckFolder()
发布时,根据给定的开始时间和间隔ping一个Web服务(通过Timer
方法)。
麻烦的是,每次运行程序时,它都会为第一个Watcher输出一条消息,然后程序会毫无错误地退出。它得到了第一个答案,它已经完成了。
如何让它等待所有计时器的其他出版物?
我几乎是肯定的我不是以正确的方式提出这个问题,但希望一些反馈可以帮助我改进我的问题。
感谢。
答案 0 :(得分:2)
这可能是因为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的末尾,这就是你的程序的结束。
因此,您需要找到一种方法来避免您的应用在您阅读之前退出。等待按下特定键是常用的方法,因此可能对您有用。 e.g。
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)
{
}
}