2013-08-23 48 views
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. 

這是從this post代碼,讓我一個很好的點點開始沿着這條道路。我們的目標是每發佈一次Timer,就會根據給定的開始時間和時間間隔來ping Web服務(通過CheckFolder()方法)。

問題是,每次運行程序時,它都會爲第一個Watcher輸出一條消息,然後程序退出而沒有錯誤。它得到第一個答案,並且完成。

如何讓它等待來自所有計時器的其他出版物?

我幾乎是積極的我不是問這個問題的正確方法,但希望有一點反饋將幫助我改進我的問題。

謝謝。

回答

2

這可能是因爲Subscribe是一個非阻塞呼叫。即如果你有;

static void Main(string[] args) 
{ 
    Observable.Timer(DateTimeOffset.Now, TimeSpan.FromSeconds(0.5)) 
      .Subscribe(x => Console.WriteLine("Got " + x)); 
} 

你可能會發現不打印輸出(或者「得到0」,這取決於你的PC是如何感覺)

如果從退出停止主內存,等待一個按鍵被按下,像這樣:

static void Main(string[] args) 
{ 
    Observable.Timer(DateTimeOffset.Now, TimeSpan.FromSeconds(0.5)) 
       .Subscribe(x => Console.WriteLine("Got " + x)); 
    Console.ReadKey(); 
} 

然後它應該保持打印輸出值,直到你按下一個鍵。

需要記住的是,擁有激活訂閱並不足以讓您的程序繼續運行。如果你正在用一些用戶界面編寫應用程序,那麼你通常會有一個消息循環 - 這會讓你的程序一直存在,直到你關閉該窗口。但是,對於控制檯應用程序來說,情況並非如此,一旦你到達主體的盡頭,那就是程序的結束。

因此,您需要找到一種方法來避免您的應用在閱讀之前退出。等待按下特定的按鍵是一種常用的方法,因此可能適用於您。例如

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) 
    { 
    } 
} 
+1

一個方便的方法來記住這是做正確的事情,也捕獲訂閱,即'var subscription = Observable.Timer(...)。Subscribe(...);'現在你有一個代表訂閱的「IDisposable」,您現在必須考慮何時清理此資源。然後這應該強制你考慮爲什麼你的應用程序不會落在'static void Main'方法的底部。 –