3

タイマーの経過イベントでタイマー間隔よりも時間がかかるジョブを実行したいのですが、その結果、コードを実行すると、タイマーの間隔がジョブよりも小さいため、タイマーが新しいスレッドを作成して続行します。コードを長期間実行すると、メモリが大量のスレッドによって破損します。

私はこの問題を興味深い方法で解決しました。つまり、次のとおりです。

startListener()
{
Timer timer = new Timer(100);
timer.elapsed += new Elapsed(elapsed_timer);
timer.start();
}

void elapsed_timer()
{
timer.stop();
try
{
//some work that takes lots of time
}
catch()
{
//some work
}
finally
{
timer.stop();
}
}

私の質問は:

このソリューションは、長期間のアプリケーションで問題がありますか、それとも他のより適切なソリューションはありますか?

4

1 に答える 1

2

タイマーを開始および停止するべきではありませんが、設定することはできますtimer.Enabled = false( msdn doc )。

また、実行時間の長いコード ブロックをブロックにラップすることもお勧めしMonitor.TryEnterます。timer.Enabledこれにより、プロパティが変更される前に 2 つの経過したイベントがキューに入れられるというまれな (可能性はありますか?) 可能性がカバーされます。

void elapsed_timer() 
{ 
  timer.Enabled = false; 
  try 
  { 
    //some work that takes lots of time 
  } 
  catch() 
  { 
    //some work 
  } 
  finally 
  { 
    timer.Enabled = true; 
  } 
} 
于 2012-06-08T18:12:56.193 に答える