C# 以批处理方式轮询具有反应式扩展的数据库表
我试图找出使用被动扩展轮询单个DB表的方法 我有一个方法C# 以批处理方式轮询具有反应式扩展的数据库表,c#,system.reactive,reactive,C#,System.reactive,Reactive,我试图找出使用被动扩展轮询单个DB表的方法 我有一个方法GetEmployees(),它返回employees表中的所有记录 var query = "SELECT emp_no, first_name, last_name FROM Employees" ; while (reader.Read()) { : : yield return employee; } 接下来,我有一个扩展方法,它获取上述员工源(AsObserv
GetEmployees()
,它返回employees表中的所有记录
var query = "SELECT emp_no, first_name, last_name FROM Employees" ;
while (reader.Read())
{ :
:
yield return employee;
}
接下来,我有一个扩展方法,它获取上述员工源(AsObservable),定期轮询可观察对象并返回实际结果
public static IObservable<T> Poll<T>(this IObservable<T> source, TimeSpan period, IScheduler scheduler)
{
return Observable.Timer(period, scheduler)
.SelectMany(_ => source)
.Retry()
.Repeat(); //Loop
}
一旦开始处理,该表将不会有新数据进入
我正在学习基于推送的集合和并发集合的注意事项
如果您能指导我-如何以批处理方式处理表中的所有记录,直到最后一条记录。我不知道您为什么认为创建IEnumerable的可观察项会神奇地从数据库中获取数据并将数据推送到流中。您的
GetEmployees
只被调用一次,因此只有一次对数据库的调用。另外,您想用这个缓冲和TakeUntil实现什么?你能再描述一下你想要的行为吗?你问题中的代码没有显示问题的来源。这不是一个好主意。因此,我们只能猜测问题可能是什么。我怀疑您构造了代码,这样您的observable的订户就不会发起对GetEmployees
的调用。我认为推迟执行是你的问题。我还认为您需要一个Observable.Defer(()=>GetEmployees().ToObservable())
。但是如果没有完整的运行代码来复制您的问题,我不能确定。嗨@peter bons,谢谢您阅读我的问题。是的,我希望我的GetEmployees()方法会产生一个“可枚举流”。我的StreamDBDatawithThrorrling()将批处理生成的流。我认为我的这个假设是错误的。因此,现在我正在实现一个StroredProc,它单独发送成批记录。。反应式扩展将用于安排对同一StroredProc的定期轮询。然后,我的任务将通过为每个批生成任务来处理获得的文件。嗨@Enigmativity,谢谢你回答我的问题。我遇到过一些观点,认为反应式编程是异步批处理项目的方式。反应式扩展通过引入基于推送的集合来满足任务。我的基本需求是拥有一个可观察的集合,它充当针对定期获得的结果集生成任务的源。轮询DB>逐批获取记录>根据获取的记录调整订阅的任务。我需要Retry()、Repeat()来回答可能出现的场景,如DB/network-to-DBdown@Manotoshsil-不,您不需要重试()
/重复()。您可能只需要Defer()
。您需要向我们展示您的完整代码-a-以便我们确切了解问题所在。
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 } )
}
});
}