0

FTP 経由で 10 秒ごとにファイルをダウンロードするアプリケーションを作成しました。次のタイマーのコードがあります。

timer3.Tick += new EventHandler(updateLogs);
timer3.Interval = (1000) * (10);
timer3.Enabled = true;
timer3.Start();

私の updateLogs 関数:

timer3.Enabled = false;
server1_log = downloadLog("192.168.0.217", 1);
server2_log = downloadLog("192.168.0.216", 2);
server3_log = downloadLog("192.168.0.215", 3);
timer3.Enabled = true;

リクエストに 10 秒以上かかる場合があることを認識しています。これが、downloadLog() を呼び出す前にタイマーを無効にし、後で有効にする理由です。

それでも、約 1 分後にアプリケーションがフリーズし、CPU 使用率が 45% 以上に跳ね上がります。timer3 のコードをコメントアウトすると、アプリケーションは長時間正常に動作し、クラッシュすることはありません。

何か案は?

4

1 に答える 1

5

を使用しているSystem.Windows.Forms.Timer場合は、この種の動作を予期する必要があります。このクラスは非同期で操作を実行しているように見えますが、実際には UI スレッドを使用して実際の作業を行っています。そのため、タイマーによって実行されたロジックが停止すると、UI も停止します。


これを軽減するには、実際にはバックグラウンド スレッドで動作するタイマーを使用するか、代わりにBackgroundWorker.

Timer.NET BCL には 3 つのクラスがあります。

  1. System.Windows.Forms.Timer
  2. System.Threading.Timer
  3. System.Timers.Timer

あなたのニーズに最も適しているのはSystem.Timers.Timerです(これについての議論はかなり長くなります。詳細については、これら 3 つを比較する MSDN Magazine の記事を読むことをお勧めします)。

また、作業を非同期で行って UI を更新するときに知っておく必要があるのは、ワーカー スレッドから UI に直接アクセスできない/アクセスすべきではないということです。このトピックに関するSOの質問を見てください。

于 2012-08-15T15:12:58.750 に答える