2013-01-21 52 views
1

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

  1. DoSomeTask
  2. 如果失败了再等待5分钟,然后再试一次。
  3. 显示结果。

部分代码:

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

你确定在查询中这样做有意义吗?看起来,在数据库上有一个时间戳字段,并且在执行查询之前检查它是否更有意义 –

+0

这类似于通过套接字将某些数据发送到服务器,并且取决于收到的结果,但是延迟时间再次重试相同的任务。 –

+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分钟再扔 如果异常,请重试。

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