1

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

  1. DoSomeTask
  2. 失敗した場合は、5 分待ってから再試行してください。
  3. 結果を表示します。

コード部分:

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

2 に答える 2

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

(上記のコードはテストされていないことに注意してください)

生徒が合格した場合は完了、そうでない場合は 5 分待ってから例外をスローし、再試行します。

于 2013-01-22T12:58:08.630 に答える
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));
于 2013-01-22T01:50:20.263 に答える