2017-05-17 3 views
0

バックグラウンドワーカーの使用に関するいくつかの記事が見つかりました。私はコード例を使用し、3つの異なるSQLクエリを実行するためにこれを実行しようとしました。私がRunBackGroundWorkerProcesses1の中で壊れたときに下に掲載されたコードでは、そこに停止して呼び出されますが、worker_DoWork1のメソッドはコード内にあっても呼び出されません。私はこれを誤解していると仮定しています。誰かが明快さを加えることができますか?私は参考のために使用さWPFアプリケーションのバックグラウンドワーカープロセスに問題がある

リンク: WPF Multithreading

コード:

public CallInformationMainScreen() 
     { 
      InitializeComponent();  

//This is where i call the background processes 
      RunBackGroundWorkerProcesses1(); 
      RunBackGroundWorkerProcesses2(); 
      RunBackGroundWorkerProcesses3();  
     } 
     #endregion 

     #region Methods used to generate data for the UI 
     public string DisplayTotalDailyCalls() 
     { 
      DailyCallsQuery db = new DailyCallsQuery(); 
      return db.GetNumber(SkillNumber); 
     } 
     public string DisplayTotalLastSevenCalls() 
     { 
      PrevSevenCallQuery db = new PrevSevenCallQuery(); 
      return db.GetNumber(SkillNumber); 
     } 
     public string DisplayDailyAbandonCalls() 
     { 
      DailyAbandonQuery db = new DailyAbandonQuery(); 
      return db.GetNumber(SkillNumber); 
     }  


     #endregion 

     #region Background worker processes   
     private void RunBackGroundWorkerProcesses1() 
     { 
      BackgroundWorker worker = new BackgroundWorker();    
      worker.DoWork += new DoWorkEventHandler(worker_DoWork1); 
      worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 

      System.Timers.Timer t = new System.Timers.Timer(10000); // 10 second intervals 
      t.Elapsed += (sender, e) => 
      { 
       // Don't try to start the work if it's still busy with the previous run... 
       if (!worker.IsBusy) 
        worker.RunWorkerAsync(); 
      }; 
     } 
     private void RunBackGroundWorkerProcesses2() 
     { 
      BackgroundWorker worker = new BackgroundWorker();   
      worker.DoWork += new DoWorkEventHandler(worker_DoWork2); 
      worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 

      System.Timers.Timer t = new System.Timers.Timer(10000); // 10 second intervals 
      t.Elapsed += (sender, e) => 
      { 
       // Don't try to start the work if it's still busy with the previous run... 
       if (!worker.IsBusy) 
        worker.RunWorkerAsync(); 
      }; 
     } 
     private void RunBackGroundWorkerProcesses3() 
     { 
      BackgroundWorker worker = new BackgroundWorker();    
      worker.DoWork += new DoWorkEventHandler(worker_DoWork3); 
      worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 

      System.Timers.Timer t = new System.Timers.Timer(10000); // 10 second intervals 
      t.Elapsed += (sender, e) => 
      { 
       // Don't try to start the work if it's still busy with the previous run... 
       if (!worker.IsBusy) 
        worker.RunWorkerAsync(); 
      }; 
     } 

     private void worker_DoWork1(object sender, DoWorkEventArgs e) 
     { 
      // Whatever comes back from the lengthy process, we can put into e.Result    
      TotalDailyCalls = DisplayTotalDailyCalls(); 
      e.Result = TotalDailyCalls; 
     } 
     private void worker_DoWork2(object sender, DoWorkEventArgs e) 
     { 
      // Whatever comes back from the lengthy process, we can put into e.Result    
      TotalDailyLast7Days = DisplayTotalLastSevenCalls(); 
      e.Result = TotalDailyCalls; 
     } 
     private void worker_DoWork3(object sender, DoWorkEventArgs e) 
     { 
      // Whatever comes back from the lengthy process, we can put into e.Result 
      TotalDailyAbandon = DisplayDailyAbandonCalls(); 
      e.Result = TotalDailyAbandon; 
     } 

     private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      // First, handle the case where an exception was thrown. 
      if (e.Error != null) 
      { 
       // handle the System.Exception 
       MessageBox.Show(e.Error.Message); 
      } 
      else if (e.Cancelled) 
      { 
       // now handle the case where the operation was cancelled... 
       ErrorHolder = "The operation was cancelled"; 
      } 
      else 
      { 
       // Finally, handle the case where the operation succeeded 
       ErrorHolder = e.Result.ToString(); 
      } 
     } 
     #endregion 
+0

このコードで何をしようとしているのですか?バックグラウンドでこれらの3つのクエリを繰り返し実行しようとしているということですか? – Enigmativity

+0

はい、番号はコールキューに入ってくるコールで、数分ごとに更新されます。私は、少なくとも以下の答えと私が逃したシンプルなタイマーの開始のおかげで、今のように見える機能にそれを得た後、時間を調整しようとしていた。 – mrcavanaugh09

+0

これを行うには単純な方法があります。私はあなたにあなたを見せるための答えをポップアップします。 – Enigmativity

答えて

2

タイマーを開始しません。 Timer.Start Method()を参照してください。

private void RunBackGroundWorkerProcesses1() 
    { 
     BackgroundWorker worker = new BackgroundWorker();    
     worker.DoWork += new DoWorkEventHandler(worker_DoWork1); 
     worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 

     System.Timers.Timer t = new System.Timers.Timer(10000); // 10 second intervals 
     t.Elapsed += (sender, e) => 
     { 
      // Don't try to start the work if it's still busy with the previous run... 
      if (!worker.IsBusy) 
       worker.RunWorkerAsync(); 
     }; 
     t.Start(); // Start the timer 
    } 
+0

ありがとうございました。 – mrcavanaugh09

0

BackgroundWorker.RunWorkerAsync()Timer.Elapsedイベントが発生したときにのみ呼び出されます。タイマーは10秒間隔に設定されているため、BackgroundWorkerは10秒間は起動しません。作成して初期化した後すぐにBackgroundWorker.RunWorkerAsync()に電話して、すぐに起動するようにしてください。

+0

backgroundworker.runworkerasync()はすでに各メソッドのifステートメントで呼び出されています。また、アプリケーションの実行中に何分も待っていて、SQL Queryメソッドのどれもヒットしていません。 – mrcavanaugh09

1

これを簡単に行う方法を示すために、これを投稿します。それは質問への直接の答えであることを意味しません。

あなたNuGet "System.Reactive" とあなたがこれを行うことができます関連するWPFライブラリの場合:それだ

IDisposable subscription = 
    new [] 
    { 
     Observable.Interval(TimeSpan.FromSeconds(10.0)).Select(x => DisplayTotalDailyCalls()), 
     Observable.Interval(TimeSpan.FromSeconds(10.0)).Select(x => DisplayTotalLastSevenCalls()), 
     Observable.Interval(TimeSpan.FromSeconds(10.0)).Select(x => DisplayDailyAbandonCalls()), 
    } 
    .Merge() 
    .ObserveOnDispatcher() 
    .Subscribe(x => ErrorHolder = x, e => MessageBox.Show(e.Error.Message)); 

。ジョブが完了しました。すべてのコードを技術的に1行のコードで記述します。

+0

聖なるものです。笑。これを正しく理解するだけで、私のバックグラウンドワーカーメソッドの3つすべてが置き換えられます。そして、それでも彼らはバックグラウンドプロセスとして動作することができますか?これらすべての理由は、これらのSQLメソッドの1つがトリガされるたびにアプリケーションをロックするためです。クエリーがバックグラウンドプロセスとして起きていることを確認する必要があります。 – mrcavanaugh09

+0

実際には、これも私の完成したすべての私のdoworkメソッドを置き換えます。ワオ。 – mrcavanaugh09

+1

@ mrcavanaugh09 - はい、正しいです。すべてバックグラウンドですべての実行間に10秒の間隔を空けて、すべて並列に実行し、コード内のすべてのメソッドをすべて置き換えます。 – Enigmativity

関連する問題