我正在尝试找出使用Reactive Extensions轮询单个数据库表的方法。
我有一个方法GetEmployees()
,它返回Employee表中的所有记录。
var query = "SELECT emp_no, first_name, last_name FROM Employees" ;
while (reader.Read())
{ :
:
yield return employee;
}
接下来,我有一个Extension方法,它接受上面的Employee Source(AsObservable)并定期轮询observable并返回Actual results。
public static IObservable<T> Poll<T>(this IObservable<T> source, TimeSpan period, IScheduler scheduler)
{
return Observable.Timer(period, scheduler)
.SelectMany(_ => source)
.Retry()
.Repeat(); //Loop
}
然而,当我尝试在定期间隔后从我的客户端代码调用上述轮询时,我看到它一遍又一遍地重复相同的结果。它没有进展到表中的下一批记录。
客户端代码如下所示: -
private static void StreamDBDataWithThrottling()
{
var r = GetEmployees().ToObservable();
r.Poll(TimeSpan.FromSeconds(2), Scheduler.Default)
//.Take(20)
// .Concat(Observable.Interval(TimeSpan.FromSeconds(0.01)).Take(100))
.Buffer(20, 20)
.TakeUntil(DateTimeOffset.Now.AddSeconds(15))
.Subscribe((data) =>
{
foreach (var item in data)
{
Console.WriteLine(item.FirstName);
// Todo: - Real Business Logic with Task.Factory.StartNew( _ => { // intensive task here } )
}
});
}
一旦处理开始,该表将不会有新数据进入。
我正在学习基于推送的集合和并发集合的注意事项。
如果您能指导我,请提前致谢 - 如何批量处理该表的所有记录,直至最后一条记录。