为什么Reactive ToObservable中使用的方法没有返回

本文关键字:方法 返回 Reactive ToObservable 为什么 | 更新日期: 2023-09-27 17:58:38

我正在寻找RX问题的解决方案。

我有一个对象列表:List<Employee>,每个员工都有一个ID和代码号。在另一个dll中有一个类,它获取每个员工的id和代码号,并执行涉及多个数据库插入的长时间运行的处理。此数据库插入位于另一个dll的静态类中。

我的问题是,我使用的RX查询有时只起作用,大多数时候不起作用。这意味着代码中没有错误。如果运行代码10次,2次运行正常,8次失败。我使用的是.NET框架的v4.0。

 IObservable<string> RunProcess(Employee emp)
    {           
        using (AnotherDLLClass p = new AnotherDLLClass(emp.id))
        {
            return Observable.Start(() => p.StartLongRun(emp.Code),   Scheduler.ThreadPool);
        }                        
    }

此employeedatas列表可能包含1000或2000条记录。

   EmployeeDatas.ToObservable().Select(x => RunProcess(x).Select(y => new { edata = x, retval = y }))
                    .Merge(10)
                    .ObserveOn(Scheduler.CurrentThread)
                    .Subscribe(x =>
                    {
                        SendReportStatus(x.retval.Item1, x.retval);                           
                    });

另一个dll中的StartLongRun()方法具有以下结构。

 public string StartLongRun(string code)
  {
     Method1(); // this method has a loop and each loop inserts data to db.
                // each loop calls DBHelper.Save() method to insert data to db.
                // sql con.opens and closes for each insert.
     Method2(); // doing exactly the same like Method1;
     return statusreport; // This return is not happening ????
  }

运行应用程序后,当我检查数据库时,值正在插入数据库正确地每秒钟当我检查表的计数时,数据都会正确保存并且计数每秒钟都在增加。

但是为什么该方法没有正确返回。AnotherDLLClass实现了IDisposable。当我把断点放在返回部分代码上时,它并没有命中。

当EmployeeDatas只有1个项目时,它就会出现在那里。当我实现代码的第一天,它可以很好地处理1000个项目。整整一天,我都在使用相同的代码,它能很好地处理1000个项目。

但第二天,当我运行该应用程序时,数据插入正确,但它没有返回调用。我不理解这种奇怪的行为。

请给我一些光,并引导我。

对于这种奇怪的行为,没有人回答任何解决办法。我在这里犯了什么错误吗?请引导我。

为什么Reactive ToObservable中使用的方法没有返回

using (AnotherDLLClass p = new AnotherDLLClass(emp.id))
{
    return Observable.Start(() => p.StartLongRun(emp.Code),   Scheduler.ThreadPool);
}

在上面的代码中,您正在using子句中实例化p。然后在lambda表达式中使用p,该表达式将被异步调用。看起来像是比赛状态。如果() => p.StartLongRun将被快速执行,那么也没有例外。但在using}之后,p被丢弃,内部lambda表达式将失败。