次のクエリをどのように作成すればよいでしょうか。学生が失敗した場合はタスクを繰り返してもらいたいのですが、次の再試行には少し時間がかかる必要があります。
- 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));