2010-09-16 4 views
4

У меня есть приложение консоли и в основном методе, у меня есть такой код:Как остановить таймер после его запуска?

Timer time = new Timer(seconds * 1000); //to milliseconds 
time.Enabled = true; 
time.Elapsed += new ElapsedEventHandler(time_Elapsed); 

Я только хочу, чтобы таймер запускается один раз так что моя идея заключается в том, что я должен остановить таймер в методе time_Elapsed. Однако, поскольку мой таймер существует в Main(), я не могу получить к нему доступ.

+0

System.Timers.Timer или System.Windows.Forms.Timer? Пожалуйста, укажите, потому что я пришел сюда по тому же вопросу, но ответ на другой таймер и не поможет. – PandaWood

ответ

21

У вас есть доступ к таймеру внутри метода timer_Elapsed:

public void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    Timer timer = (Timer)sender; // Get the timer that fired the event 
    timer.Stop(); // Stop the timer that fired the event 
} 

выше метод остановит любой таймер уволил событие (в случае, если у вас есть несколько таймеров, использующих один и тот же обработчик, и вы хотите, чтобы каждый таймер имел одинаковое поведение).

Вы можете также установить поведение при создании экземпляра таймера:

var timer = new Timer(); 
timer.AutoReset = false; // Don't reset the timer after the first fire 
+1

Это то, что я хотел сделать, и вы ответили правильно во-первых, так что большой чек! – Yom

3

Небольшого примера приложение:

static void Main(string[] args) 
    { 
     int seconds = 2; 
     Timer time = new Timer(seconds * 1000); //to milliseconds 
     time.Enabled = true; 
     time.Elapsed += new ElapsedEventHandler(MyHandler); 

     time.Start(); 

     Console.ReadKey(); 
    } 

    private static void MyHandler(object e, ElapsedEventArgs args) 
    { 
     var timer = (Timer) e; 
     timer.Stop(); 
    } 
2

Я предполагаю, что вы используете System.Timers.Timer, а не System.Windows.Forms.Timer?

У вас есть два варианта.

Во-первых, как, вероятно, лучше всего установить AutoReset на false. Это должно делать именно то, что вы хотите.

time.AutoReset = false; 

Другой вариант заключается в вызове Stop в обработчик событий.

1

Вы также можете использовать System.Threading.Timer. Его конструктор принимает два временных связанные параметры:

  • Задержка перед первым «галочки» (из-за времени)
  • Период

Установите период с Timeout.Infinite, чтобы предотвратить от стрельбы снова ,

+0

Как установить его в Timeout.Infinite, вероятно, разумный вопрос - это не очевидно – PandaWood

Смежные вопросы