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()されるたびに(メソッドを介して) Web サービスに ping を実行することです。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));
}

おそらく、何も出力されないことに気付くでしょう (または、PC の状態によっては、「Got 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)
    {
    }
}
于 2013-08-24T13:21:19.997 に答える