1

我一直在为我在 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 个项目上运行良好。

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

请对此有所了解并指导我。

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

4

1 回答 1

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

p在上面的代码中,您在using子句中进行实例化。然后,您将使用p将异步调用的 lambda 表达式。它看起来像比赛条件。如果() => p.StartLongRun将被快速执行,那么也不例外。但是在}of之后usingp被释放并且内部 lambda 表达式将失败。

于 2013-02-15T19:28:16.800 回答