1
如何撰寫以下查詢,以便我希望學生在失敗時重複該任務,但他的下一次重試必須延遲。撰寫延遲查詢
- DoSomeTask
- 如果失敗了再等待5分鐘,然後再試一次。
- 顯示結果。
部分代碼:
student.DoSomeTask()
.Repeat()
.SkipWhile(r => r.Succeeded == false);
如何撰寫以下查詢,以便我希望學生在失敗時重複該任務,但他的下一次重試必須延遲。撰寫延遲查詢
部分代碼:
student.DoSomeTask()
.Repeat()
.SkipWhile(r => r.Succeeded == false);
student.DoSomeTask()
.SelectMany(r=>r.Succeeded
? Observable.Empty<long>()
: Observable.Timer(TimeSpan.FromMinutes(5)).Concat(Observable.Throw<long>(new ExamFailedException())).IgnoreElements())
.Retry()
(注意上面的代碼沒有經過測試)
如果學生通過了,那麼完整的,否則等待5分鐘再扔 如果異常,請重試。
我做了一個新的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));
你確定在查詢中這樣做有意義嗎?看起來,在數據庫上有一個時間戳字段,並且在執行查詢之前檢查它是否更有意義 –
這類似於通過套接字將某些數據發送到服務器,並且取決於收到的結果,但是延遲時間再次重試相同的任務。 –
該邏輯應該在初始化請求的代碼中處理,而不是查詢本身。 –