2012-04-16 30 views
2

私のWPFアプリケーションにはいくつかのタイマーが関係します。すべてDispatcherTimersで動作しますが、遅延は巨大でフリーズが頻繁に発生します(たとえば、3秒のフリーズ、その後の3秒の一時停止など)。複数のタイマーWPFアプリケーション、呼び出しスレッドはSTAエラーである必要があります。エラー

私の問題は、この問題を回避するためにアプリケーションをどのように再設計する必要があるのか​​よく分かりません。これまでのスレッドと、初めての実際のWPFアプリケーションでは、決して作業しませんでした。

次のエラーが発生します。 多くのUIコンポーネントでこれが必要なため、呼び出しスレッドはSTAである必要があります。

私は名前空間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種類のディスパッチャータイマーがあります。

    • 現在時刻を表示するためのSQLクエリを実行し、内部ダウンタイムタイマーを毎秒を更新する毎に5秒に
    • つの日付の値を取得する(HH:SS形式:MM)
    • ワン動的なカスタムスタイルのWPFボタン。私はその間にダウンタイムを記録するためにストップウォッチを使用します。

    だから、私はトレッドおよび/またはBackgroundWorkerので作業する必要があるようですか?

    私は実際にこれで始まる方法はわかりません。なぜなら、私はかなりの時間がかかりません。いくつかのサンプルコードは大歓迎です。

    Tldr:

    私は次のような理由のためにタイマーを使用します。

    • を表示し、現在の時刻
    • 録音の停止時間(リアルタイムので、私は実際にそれが第二のカウントを参照)
    • 5秒ごとに実行されるSQLクエリ。

    EDIT:

    public void InitializeDispatcherTimerW() 
        { 
         TimerCallback callback = MyTimerCallBack; 
         timerWegingen = new Timer(callback, null, 0, 5000); 
    
         timerWegingen.Change(0, 5000); 
        } 
    
        private void MyTimerCallBack(object state) 
        { 
         DisplayWegingInfo(); 
         CaculateTimeBetweenWegingen(); 
        } 
    

    敬具、 Jackz。

  • 答えて

    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); 
    

    コールバック関数は次のようになります。タイマーコールバックのコードはあなたが使用する必要があるUI要素と対話するとき

    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. 
    } 
    
    +0

    スレッドタイマーを使用しているときにtickメソッドを宣言しようとすると、エラーが発生しているようです。 – Jackz

    +0

    Tickイベント/メソッドはありません。どういう意味ですか? –

    +0

    私はx秒ごとに特定のメソッドを実行することを意味します。このようなタイマーでこれをどうすればいいのですか? – Jackz

    関連する問題