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 個のアイテムで問題なく動作していました。
しかし、翌日アプリを実行すると、データは正しく挿入されますが、呼び出しが返されません。私はこの奇妙な行動を理解していません。
これに光を当てて、私を導いてください。
この奇妙な動作に対する解決策は誰も答えていません。私がここでやった間違いはありますか?私を案内してください。