C# 为什么从被动到可观察使用的方法没有返回?

C# 为什么从被动到可观察使用的方法没有返回?,c#,system.reactive,C#,System.reactive,我一直在寻找解决我看到的RX问题的方法 我有一个对象列表:list,每个员工都有一个ID和代码。另一个dll中有一个类,它接受每个员工的id和代码号,并执行涉及多个db插入的长时间运行的处理。此db insert位于另一个dll的静态类中 我的问题是,我使用的RX查询只是有时有效,而大多数时候无效。这意味着代码中没有错误。如果运行代码10次,2次运行正常,8次失败。我正在使用.NET framework的v4.0 IObservable<string> RunProcess(Emp

我一直在寻找解决我看到的RX问题的方法

我有一个对象列表:list,每个员工都有一个ID和代码。另一个dll中有一个类,它接受每个员工的id和代码号,并执行涉及多个db插入的长时间运行的处理。此db insert位于另一个dll的静态类中

我的问题是,我使用的RX查询只是有时有效,而大多数时候无效。这意味着代码中没有错误。如果运行代码10次,2次运行正常,8次失败。我正在使用.NET framework的v4.0

 IObservable<string> RunProcess(Employee emp)
    {           
        using (AnotherDLLClass p = new AnotherDLLClass(emp.id))
        {
            return Observable.Start(() => p.StartLongRun(emp.Code),   Scheduler.ThreadPool);
        }                        
    }
另一个dll中的StartOngRun方法具有以下结构

 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 ????

  }
运行应用程序后,当我检查数据库时,这些值将插入到数据库中 正确地当我检查表的计数时,数据会被正确保存 计数每秒钟都在增加

但是为什么该方法不能正确返回。另一个DllClass已实现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.StartOngRun将快速执行,则没有异常。但是在使用}之后,p被释放,内部lambda表达式将失败。

感谢您的回复。但如果我使用而不使用子句,它是相同的。它不会回电话。我使用using的原因是,在另一个dllclass中有很多对象,比如另一个webservice代理对象、ADO对象等。因此,对于每个调用,它应该处理另一个dllclass使用的所有资源。这就是为什么我经常使用子句。即使我创建了另一个DllClass的实例并调用p.StartongRun方法,结果也没有变化。您对此有进一步的想法吗?我在Scheduler.ThreadPool中看到的另一个问题。根据MSDN,此调度器是短期运行操作的理想选择。将其替换为Scheduler.NewThread。根据MSDN的说法,这个调度程序非常适合长时间运行的操作。嗨,我很久以前也尝试过使用NewThread。它比线程池慢。但它不会回来。如果使用1个employee对象运行,我的LongRunning方法最多需要15-20秒。这就是我使用ThreadPool的原因,当我第一次跑步时,它非常快。但是我不知道发生了什么。如果我把startOngRun方法的最后一个return语句的断点放在这里,它就永远不会到达那里。
using (AnotherDLLClass p = new AnotherDLLClass(emp.id))
{
    return Observable.Start(() => p.StartLongRun(emp.Code),   Scheduler.ThreadPool);
}