問題の効率的な解決策を探しています。私はVS 2010を使用しています.wcfサービスメソッドから一連の操作を行い、各操作のステータスを呼び出し元のクライアントに送り返したいです。コールバック コントラクトで wcf をセットアップし、二重チャネルを使用して、wcf に接続できます。長期実行操作を開始すると、コールバックがトリガーされることがありますが、トリガーされない場合があります。どうしてか分かりません。以下は私が従った方法です。
wcf サービス メソッドでは、
public void Start()
{
List<Employee> empLists = GetEmpData(); // geting lots of employee objects
foreach(Employee emp in empLists) // maybe 1000 records
{
StartlongRunning(emp);
}
}
private void StartlongRunning(Employee emp)
{
// here i am creating a new background worker...
// Here i am registering for RunWorkerCompleted, DoWork, ReportProgress events...
bgw.RunWorkerAsync(emp)
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
Employee emp = (Employee)e.Argument;
using (ClassA p = new ClassA(emp.ID)) // this class is from another dll.
{
e.Result = p.StartProcess(emp.Code);
}
}
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// This is not calling properly.
// Sometimes this method is working...most of the time it is not working..
// here i am unregistering the registerd DoWork, RunWorkerCompleted events...
// calling bgw.Dispose(); // i tried without this also;...but no use...
// from here I am firing the callback to client...
}
StartProcess メソッドの実装を次に示します。
public string StartProcess(string empcode)
{
// call to another method1() // here saving to DB frequently. works fine
// call to another method2() // here also saving to DB frequently. works fine
// call to someother method3() // here also some DB insert frequently. fine
// call to Method4() // here also some DB insert.
// this method is not calling frequently..
// sometimes it is calling but most of times not..why ???
return value;
}
private void SaveToDB(args1, args2...)
{
DatabaseHelper.Save(args1, args2.....); // this static class is from another dll
// only DB operation in this static class..
}
この静的クラスの実装は次のとおりです。
using (SqlConnection conn = new SqlConnection(DBConnection))
{
conn.open;
using (SqlCommand cmd = conn.CreateCommand())
{
...adding parameters
cmd.ExecuteNonQuery();
}
conn.close();
}
がStartProcess
返されると、バックグラウンド ワーカーがRunWorker
メソッドを実行します。しかし、それは起こっていません。ここで何が問題なのですか?
ClassA
バックグラウンドワーカーごとに各オブジェクトを作成しています。そして、オブジェクトClassA
が完了すると、それは破棄されます。
StartProcess
しかし、なぜ電話が適切に返されないのかわかりません。
ClassA
私の実装では、バックグラウンド ワーカー間でオブジェクトが重複していますか??