2

クラスレベルでオブジェクトを宣言System.Timers.Timerし、コンストラクターで作成しました。別のメソッドでタイマーを開始しました。

経過したイベント ハンドラーで有効なプロパティを false に設定し、いくつかのコードを実行してから、再度有効に設定して true に設定します。

各インターバルの経過イベントを取得しています。問題は、しばらく時間が経過した後です。

経過イベント hanler eventhadler で false に設定された瞬間に有効なプロパティで、タイマー オブジェクトが GC によって収集されていると思われます。

だから私はタイマーオブジェクトが生き続けるように設定したい。

GC.KeepAlive(timer)プロジェクトのどこで宣言する必要がありますか?

4

1 に答える 1

5

タイマーがクラス レベルで宣言されている場合、スコープ外に出ないため、GC によって自動的に収集されません。また、に設定Enabledしてfalseも、説明した動作は発生しません。あなたの問題は別の場所にあります。

イベント ハンドラに例外があると思われます。System.Timers.Timerイベント ハンドラーで発生する例外を飲み込みます。つまり、例外がイベント ハンドラーをエスケープした場合、そのことを知ることはできません。

あなたのコードは次のように書かれていると思います:

myTimer.Enabled = false;
// do stuff here
myTimer.Enabled = true;

「do stuff here」中に例外がスローされた場合、例外はハンドラーをエスケープし、タイマーが再度有効になることはなく、タイマー コードが例外を飲み込むため、何かが起こったことを知ることはありません。

イベント ハンドラーを次のように記述する必要があります。

myTimer.Enabled = false;
try
{
    // do stuff here
}
catch (Exception ex)
{
    // handle exceptions
}
finally
{
    myTimer.Enabled = true;
}

通常、特定の例外、つまり処理方法を知っている例外だけをキャッチする必要があります。上記のようにすべての例外をキャッチすることは、一般的に悪い習慣です。

于 2013-02-18T13:52:20.467 に答える