1
如何撰写以下查询,以便我希望学生在失败时重复该任务,但他的下一次重试必须延迟。撰写延迟查询
- DoSomeTask
- 如果失败了再等待5分钟,然后再试一次。
- 显示结果。
部分代码:
student.DoSomeTask()
.Repeat()
.SkipWhile(r => r.Succeeded == false);
如何撰写以下查询,以便我希望学生在失败时重复该任务,但他的下一次重试必须延迟。撰写延迟查询
部分代码:
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));
你确定在查询中这样做有意义吗?看起来,在数据库上有一个时间戳字段,并且在执行查询之前检查它是否更有意义 –
这类似于通过套接字将某些数据发送到服务器,并且取决于收到的结果,但是延迟时间再次重试相同的任务。 –
该逻辑应该在初始化请求的代码中处理,而不是查询本身。 –