关于无功扩展计时器我有什么缺失?

时间:2013-08-23 21:47:09

标签: c# system.reactive reactive-programming reactiveui

我有这个:

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输出一条消息,然后程序会毫无错误地退出。它得到了第一个答案,它已经完成了。

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

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

感谢。

1 个答案:

答案 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)
    {
    }
}