为什么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个项目。
但第二天,当我运行该应用程序时,数据插入正确,但它没有返回调用。我不理解这种奇怪的行为。
请给我一些光,并引导我。
对于这种奇怪的行为,没有人回答任何解决办法。我在这里犯了什么错误吗?请引导我。
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表达式将失败。