多数のメニュー バー、ボタン、およびグリッド コントロールを備えた WPF C# GUI アプリケーションがあります。
メインの XAML フォーム クラスには、クラス レベルで宣言されている 5 つの System.Timer.Timer オブジェクトがあり、次のように XAML フォーム クラス コンストラクターで作成およびインスタンス化されます (一例)。
var factory = new TaskFactory();
factory.StartNew(() =>
{
dtEmergencyQueueRefresh = new System.Timers.Timer(EmerTimeoutSecs * 1000);
dtEmergencyQueueRefresh.Elapsed += dtEmergencyQueueRefresh_Tick;
dtEmergencyQueueRefresh.Enabled = true;
}
);
GUIのパフォーマンスが遅いことに気づいたので、バックグラウンドスレッドで確実に開始および実行されるようにこれを行いましたが、役に立たないようでした.
タイマーを起動するすべてのコードをコメントアウトし、それらを空の宣言のままにしておくと、GUI は期待どおりに動作し、問題ありませんでした。
パフォーマンスが低下したと言うと、クリックはまだ正常に機能しますが、メニューをドロップダウンすると、「ホバー」機能が約5〜10秒間機能しないため、5秒待たない限り、現在の行が強調表示されません私が言ったように-10秒。
また、タイマーによって呼び出されるコールバック メソッドを調べて、すべてのコードをコメントアウトして、タイマーが空のメソッドを実行するようにしました。パフォーマンスは依然として悪かったので、5 つのタイマーを実行して何も呼び出さないだけでもパフォーマンスは低下します。つまり、バックグラウンド処理がパフォーマンスを低下させているのではなく、タイマーがまったく実行されているのです。
なぜこれが起こっているのか、そしてこれらのタイマーをバックグラウンドで実行してGUIに影響を与えないようにする方法について、誰か提案がありますか?