1

我如何编写以下查询,如果学生失败,我希望学生重复任务,但他的下一次重试必须有一些延迟。

  1. 做某事
  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 回答