我正在寻找解决我遇到的问题的解决方案。
我有一个对象列表: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个项目。
但是第二天,当我运行应用程序时,数据正在正确插入,但它没有返回呼叫。我不明白这种奇怪的行为。
请注意一下并引导我。
没有人回答任何解决这种奇怪行为的方法。我在这里做错了吗?请指导我。
答案 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表达式将失败。