Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以批处理方式轮询具有反应式扩展的数据库表_C#_System.reactive_Reactive - Fatal编程技术网

C# 以批处理方式轮询具有反应式扩展的数据库表

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

我试图找出使用被动扩展轮询单个DB表的方法

我有一个方法
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 } )
                    }
                });
        }