0

我有这个:

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.

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

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

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

我几乎可以肯定我没有以正确的方式提出这个问题,但希望一些反馈可以帮助我完善我的问题。

谢谢。

4

1 回答 1

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 的末尾,那就是你的程序的结尾。

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

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)
    {
    }
}
于 2013-08-24T13:21:19.997 回答