延迟撰写查询



我怎样才能编写以下查询,以便我希望学生在失败时重复任务,但他的下一次重试必须有一些延迟。

  1. 做一些任务
  2. 如果失败,请等待 5 分钟,然后重试。
  3. 显示结果。

代码部分:

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));

相关内容

  • 没有找到相关文章

最新更新