2013-01-21 51 views
1

如何撰寫以下查詢,以便我希望學生在失敗時重複該任務,但他的下一次重試必須延遲。撰寫延遲查詢

  1. DoSomeTask
  2. 如果失敗了再等待5分鐘,然後再試一次。
  3. 顯示結果。

部分代碼:

student.DoSomeTask() 
     .Repeat() 
     .SkipWhile(r => r.Succeeded == false); 
+0

你確定在查詢中這樣做有意義嗎?看起來,在數據庫上有一個時間戳字段,並且在執行查詢之前檢查它是否更有意義 –

+0

這類似於通過套接字將某些數據發送到服務器,並且取決於收到的結果,但是延遲時間再次重試相同的任務。 –

+0

該邏輯應該在初始化請求的代碼中處理,而不是查詢本身。 –

回答

2
student.DoSomeTask() 
    .SelectMany(r=>r.Succeeded 
     ? Observable.Empty<long>() 
     : Observable.Timer(TimeSpan.FromMinutes(5)).Concat(Observable.Throw<long>(new ExamFailedException())).IgnoreElements()) 
    .Retry() 

(注意上面的代碼沒有經過測試)

如果學生通過了,那麼完整的,否則等待5分鐘再扔 如果異常,請重試。

0

我做了一個新的DelayWhile方法與延遲失敗結果的延遲參數。

public static IObservable<TSource> DelayWhile<TSource>(this IObservable<TSource> source, Func<TSource, bool> predicate, TimeSpan dueTime) 
{ 
    return Observable.Create<TSource>(
     o => source 
        .Subscribe(value => 
           { 
            bool running; 

            try 
            { 
             running = !predicate(value); 
            } 
            catch (Exception ex) 
            { 
             o.OnError(ex); 

             return; 
            } 

            if (!running) 
            { 
             Thread.Sleep(dueTime); 

             return; 
            } 

            o.OnNext(value); 
           }, 
          o.OnError, 
          o.OnCompleted)); 
} 

新的查詢是:

student.DoSomeTask() 
     .Repeat() 
     .SkipWhile(r => r.Succeeded == false, TimeSpan.FromMinutes(5));