撰写延迟查询

时间:2013-01-21 23:57:02

标签: c# linq system.reactive

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

  1. DoSomeTask
  2. 如果失败,请等待5分钟再试一次。
  3. 显示结果。
  4. 代码部分:

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

2 个答案:

答案 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分钟然后扔掉 如果异常,请重试。

答案 1 :(得分: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));