1

事前定義されたスケジュールで電子メールを送信するように構成された Windows サービスがあります。スケジュールは System.Timers.Timer で機能し、Timer_Elapsed が発生するたびに Timer.Stop() を呼び出し、メールを送信し (毎回約 1500 通のメール)、次のティックが発生する時間を計算し、タイマーを開始します ( Timer.Start() メソッドを呼び出す)。問題は、タイマーが経過し、プロセスが電子メールの送信を開始したときに、使用中のメモリが増加しますが、終了後に減少しません。「タイマーなし」アプリケーションで関数を呼び出すと、送信プロセスが終了した後に使用済みメモリが解放されます。なぜこれが起こっているのかを理解するのを手伝ってくれる人はいますか? たぶん、タイマーで使用されるスレッドに関連する何かがありますか?

前もって感謝します。

4

2 に答える 2

1

ここには、露骨な可能性がいくつかあります。

  1. ガベージ コレクションは開始されておらず、メモリ リークもありません。時間をかけて監視して、メモリ使用量がどの程度動的であるかを確認し、それがピークに達して安定するかどうかを確認します。

  2. ライブラリのクローズまたはフラッシュ関数を使用していない

  3. タイマーが終了しないスレッドを開始しています。これは、プロセス モニターを使用してスレッド カウントを監視することで簡単に確認できます。

メモリ リークは、決して不可能ではありませんが、.net 言語では起こりそうにありません。メモリに直接アクセスしたり制御したりしていません。JIT はメモリの割り当てとクリアを行うため、実際に確認する必要があるのは、コードで解放されていないことだけです。

詳細がなければ、特にファイルIOなどを行っているかどうかわからないので、より良い助けを与えることはできません.

于 2010-01-25T06:40:13.763 に答える
0

メモリリークを防ぐために、SMTPClientオブジェクト接続を閉じる必要があります。

SmtpClient client = new SmtpClient( "SMTPServerAddress"); ... client.Send(message); client.ServicePoint.CloseConnectionGroup(client.ServicePoint.ConnectionName);

于 2010-01-26T11:40:26.580 に答える