2

私の WPF アプリケーションには、いくつかのタイマーが含まれています。すべてが DispatcherTimers で機能しますが、遅延が大きく、フリーズが頻繁に発生します (たとえば、3 秒のフリーズ後、残りの 3 秒が一度に追加されます)。

私の問題は、この問題を回避するためにアプリケーションを正確に再設計する必要があるかどうかわからないことです。これまでスレッドを操作したことはなく、私の最初の実際の WPF アプリケーションでもありました。

次のエラーが表示されます: 多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。

Dispatcher タイマーを名前空間 System.Timers のタイマーに置き換えると、このエラーが発生しました。

ディスパッチャ タイマーを使用した古いコード:

timerW = new DispatcherTimer();
        timerW.Tick += new EventHandler(timerW_Tick);
        timerW.Interval = new TimeSpan(0, 0, 5000);
        timerW.Start();

タイマーを使用した新しいコード:

            timerW = new Timer();
            timerW.Elapsed += new ElapsedEventHandler(timerW_Tick);
            timerW.Interval = 5000; 
            timerW.Start();            

クエリは 5 秒ごとに実行され、日付値を取得します。特定の条件が満たされると、ボタンが動的に作成されます。たとえば、日付が 3 分間同じままである場合、ボタンが作成されます。

動的に作成されたボタンには次が含まれます。

  • データベースからの日付
  • ボタンが作成されたときに実行を開始するタイマー。このタイマーは、新しいボタンが作成されたときにのみ停止し、ダウンタイムが記録されます。
  • ダウンタイムの理由

ボタンはObservableCollectionに保存され、依存関係プロパティを使用して、何かが変更されたときに通知されるようにします。これは、情報を表示するためのいくつかのテキストブロックを持つカスタム ボタンです。

ボタン部分は、プログラム内のすべての対話が行われる場所であり、インターフェイスの残りの部分は、データベースからの情報を表示するだけです。ボタンは、左右のナビゲーション ボタンを備えたカスタム スライダーのようなコントロールに配置されます。

つまり、私のプログラムには 3 つの異なるディスパッチャ タイマーがあります。

  • 現在の時刻を表示するもの (hh:mm:ss 形式)
  • 1 つは SQL クエリを実行し、5 秒ごとに日付値を取得します
  • 1 つは、動的にカスタム スタイルの WPF ボタン内でダウンタイム タイマーを毎秒更新するものです。ストップウォッチを使用して、その間のダウンタイムを記録します。

それで、トレッドバックグラウンドワーカーで作業する必要があるようです?

しばらくの間、かなり手がかりが少ないので、実際にこれをどのように開始するかはわかりません。いくつかのサンプルコードは大歓迎です。

名前:

私がタイマーを使用する理由は次のとおりです。

  • 現在時刻を表示する
  • ダウンタイムを記録します (リアルタイムなので、実際には秒単位でカウントされます)
  • 5 秒ごとに実行される SQL クエリ。

編集:

public void InitializeDispatcherTimerW()
    {
        TimerCallback callback = MyTimerCallBack;
        timerWegingen = new Timer(callback, null, 0, 5000);

        timerWegingen.Change(0, 5000);
    }

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

よろしく、ジャックス。

4

2 に答える 2

1

System.Timers.Timerには STA スレッドが必要なようです。STA スレッドは Windows フォームの要件でしたが、WPF では必要ないようです。

System.Threading.Timerはニーズを満たしていますか?

次に例を示します。

// firstTickInterval and interval are TimeSpans
TimerCallback callback = MyTimerCallback;
Timer timer = new Timer(callback, null, firstTickInterval, interval);
// timer is now running
// To stop the timer, do timer.Change(-1, -1);

コールバック関数は次のようになります。

void MyTimerCallback(object state)
{
    // This is not guaranteed to execute on the UI thread.
    // In this example, state will be null, since we passed null in the Timer constructor.
}
于 2012-04-16T14:02:15.587 に答える
0

タイマー コールバック コードが UI 要素とやり取りするときは、以下を使用する必要があります。

UIElement.Dispatcher.BeginInvoke(...);

詳細: http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

于 2012-04-16T14:29:58.450 に答える