我一直在为我在 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 个项目上运行良好。
但是第二天当我运行应用程序时,数据正确插入,但没有返回调用。我不明白这种奇怪的行为。
请对此有所了解并指导我。
没有人回答这种奇怪行为的任何解决方案。我在这里做错了吗?请指导我。