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

时间:2013-02-10 14:48:53

标签: c# system.reactive

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

我有一个对象列表:List<Employee>,每个员工都有一个ID和代码。另一个dll中有一个类,它接收每个员工的id和代码编号,并执行涉及多个db插入的长时间运行处理。此db插入在另一个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);
        }                        
    }

此员工名单可能包含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个项目。

但是第二天,当我运行应用程序时,数据正在正确插入,但它没有返回呼叫。我不明白这种奇怪的行为。

请注意一下并引导我。

没有人回答任何解决这种奇怪行为的方法。我在这里做错了吗?请指导我。

1 个答案:

答案 0 :(得分:0)

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

在上面的代码中,您将在p子句中实例化using。然后,您将在lambda表达式中使用p,该表达式将异步调用。它看起来像竞争条件。如果() => p.StartLongRun将快速执行,那么没有例外。但在} using之后,p将被处理,内部lambda表达式将失败。