2012-04-17 1 views
0

パフォーマンスを向上させるには、スレッドタイマーを使用して5秒ごとに実行される集中クエリを処理するDispatcherTimerをBackGroundWorkerに置き換える必要があります。別の作業スレッドにクエリ/その他の集中的なロジックを配置する方法BackGroundWorker

次のコードを実装すると、結果が出なくなります。ほとんどの場合、アプリケーションがシャットダウンします。

public void CaculateTimeBetweenWegingen() 
    {   
     if (listWegingen.Count > 1) 
      msStilstand = (DateTime.Now - listWegingen[listWegingen.Count - 1]).TotalSeconds; 

     if(msStilstand >= minKorteStilstand) 
     { 
      stopWatch.Start(); 

      if (msStilstand >= minGroteStilstand) 
      { 
       FillDuurStilstandRegistrationBtn(); 

       if (zelfdeStilstand == false) 
       { 
        CreateRegistrationButton();      
        zelfdeStilstand = true; 
       } 

       if (msStilstand <= maxGroteStilstand){ 
        //.... 
       } 
      } 
     } 
     else //new weging 
     { 
      if (stopWatch.IsRunning == true) 
      { 
       timerStilstand.Stop(); 

       stopWatch.Stop(); 

       //huidige registrationBtn 
       if (GlobalObservableCol.regBtns.Count > 1) 
       { 
        GlobalObservableCol.regBtns[GlobalObservableCol.regBtns.Count - 1].StopWatchActive = false; 

        GlobalObservableCol.regBtns[GlobalObservableCol.regBtns.Count - 1].DuurStilstand = 
         String.Format("{0:D2}:{1:D2}:{2:D2}", stopWatch.Elapsed.Hours, stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds); 
       } 

      } 
      zelfdeStilstand = false; 
     } 
    }/*CaculateTimeBetweenWegingen*/ 


public void CreateRegistrationButton() 
    { 
     InitializeDispatcherTimerStilstand(); 

     RegistrationButton btn = new RegistrationButton(GlobalObservableCol.regBtns.Count.ToString()); 
     btn.RegistrationCount = GlobalObservableCol.regBtnCount; 
     btn.Title = "btnRegistration" + GlobalObservableCol.regBtnCount; 
     btn.BeginStilstand = btn.Time; 

     GlobalObservableCol.regBtns.Add(btn); 
     GlobalObservableCol.regBtnCount++; 

     btn.DuurStilstand = String.Format("{0:D2}:{1:D2}:{2:D2}", 0, 0, 0);   
    } 


public void InitializeDispatcherTimerWeging() 
    { 
     worker = new BackgroundWorker(); 
     worker.DoWork += new DoWorkEventHandler(Worker_DoWork); 
     worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
     worker.RunWorkerAsync(); 
    } 

    void Worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     TimerCallback callback = MyTimerCallBack; 
     timerWegingen = new Timer(callback); 

     timerWegingen.Change(0, 5000); 
    } 

public void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      worker.RunWorkerAsync(); 
     } 


    private void MyTimerCallBack(object state) 
    { 
     DisplayWegingInfo(); 
     CaculateTimeBetweenWegingen(); 
    } 

このボタンには、他のタイマーを使用して1秒ごとに新しい値が再設定されます。 「DuurStilstand」は

private void FillDuurStilstandRegistrationBtn() 
    { 
     TimeSpan tsSec = TimeSpan.FromSeconds(stopWatch.Elapsed.Seconds); 
     TimeSpan tsMin = TimeSpan.FromMinutes(stopWatch.Elapsed.Minutes); 
     TimeSpan tsHour = TimeSpan.FromMinutes(stopWatch.Elapsed.Hours); 

     if (GlobalObservableCol.regBtns.Count >= 1 
        && GlobalObservableCol.regBtns[GlobalObservableCol.regBtns.Count - 1].StopWatchActive == true) 
     { 
      GlobalObservableCol.regBtns[GlobalObservableCol.regBtns.Count - 1].DuurStilstand = 
          String.Format("{0:D2}:{1:D2}:{2:D2}", tsHour.Hours, tsMin.Minutes, tsSec.Seconds); 
     } 
    } 

依存性である上記のすべてのコードが別のC#クラスに書き込まれます。

このコードをBackGroundWorkerとどのように正しく動作させるには、Dispatcher/Invokeを使用してGUIを更新するにはどのようにすればよいですか。私はこの問題を解決することはできません。

また、BackGroundWorkerのCompleteメソッドを使用してGUIを更新することもできますが、どのように正確かはわかりません。これらのボタンはObservableCollectionで作成および保存されます。

public static ObservableCollection<RegistrationButton> regBtns = new ObservableCollection<RegistrationButton>(); 

いくつかの例が最も有用であろう。私は多かれ少なかれ、何をしなければならないかを知っているが、その実装方法を正確には分からない。私はあなたのアプリケーションの意味を理解していないが、たぶんレンダリングイベントが対処するお手伝いをする必要がありますが、この

public void worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) 
    { 
     Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, new Action(() => 
     { 
      //do your stuff 
     })); 
    } 

のようなUIを更新することができるでしょう

+1

を助け願っています。卑劣な –

答えて

1

よろしく、 Jackz UIThreadと一緒に。

CompositionTarget.Rendering += (s, args) => 
     { 
      //do your stuff 
     }; 

は、あなたがあなたの古いコードではなく、あなたがバックグラウンドワーカーに*問い合わせ*を実行するために行われた変更を掲示し、それは

関連する問題