0

問題の効率的な解決策を探しています。私は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私の実装では、バックグラウンド ワーカー間でオブジェクトが重複していますか??

4

2 に答える 2

1

問題は、ビジーでないことを確認せずにループで RunWorkerAsync を呼び出すことだと思います。別のスレッドですべての作業を開始しようとするのではなく、パラメーターとしてリストを指定して RunWorkerAsync を呼び出す必要があります。

私はこのようなことをします:

 public void Start()
 {
     List<Employee> empLists = GetEmpData();  // geting lots of employee objects
     StartlongRunning(empLists);
 }

それに応じて bgw_DoWork を変更します。

進行状況を確認する必要がある場合は、従業員オブジェクトごとに ReportProgress を呼び出すことができます。

于 2013-02-03T17:01:35.130 に答える
0

複数の backgroundWorker を同時に操作するアプリケーションを作成する場合は、実行中の操作ごとに新しい backgroundWorker オブジェクトを初期化する必要があります。これで問題は解決します。

于 2013-02-03T20:51:30.970 に答える