1

RX で発生している問題の解決策を探していました。

オブジェクトのリストがあります: List<Employee>、各従業員には ID とコード番号があります。別の dll には、各従業員の ID とコード番号を取得し、複数の 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 ????

  }

アプリを実行した後、DB を確認すると、値が正しく db に挿入されています。毎秒テーブルの数を確認すると、データは適切に保存され、数は毎秒増加しています。

しかし、メソッドが正しく返されないのはなぜですか。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非同期で呼び出されるラムダ式を使用しています。レースコンディションのようです。が高速に実行される場合、() => p.StartLongRun例外はありません。しかし、 の後、}は破棄され、内部ラムダ式は失敗します。usingp

于 2013-02-15T19:28:16.800 に答える