2013-10-14 4 views
-3

Я попытался выяснить, как использовать таймер в C#, но я никогда не понимал ни одного учебника. Я хочу получить цикл, который ждет секунду, а затем что-то делает (не Thread.Delay. То, что может работать одновременно, в то время как другие вещи случаются). Если кто-то может любезно рассказать мне, как написать код или написать мне образец, который новичок может понять, я был бы очень благодарен.Как использовать таймер в C#

public partial class Char1 : Form 
{ 
    private static System.Timers.Timer aTimer; 
    public static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Mainprog.count += 1; 
    } 
    public Char1() 
    { 
     InitializeComponent(); 
    } 

    private void checkBox1_CheckedChanged(object sender, EventArgs e) 
    { 
     while (checkBox1.Checked) 
     { 
      aTimer.Interval = 2000; 
      aTimer.Enabled = true; 
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

     } 
    } 
} 

Я попытался заставить его вызвать событие каждые 2 секунды, но он сработает. Любая идея о том, как это исправить?

+1

Какой язык программирования? –

+0

C# Я забыл добавить его, мой плохой – user2801706

+0

Какая платформа: asp.net, winforms, ... – M4N

ответ

2

вы не должны включать таймер в цикле while, и вы обязательно не должны добавлять eventlisters в цикл while, так как это причина, по которой ваша программа терпит крах, также timer.start() - это то, что я использую, я не знакомы с timer.enable попробовать это так:

public partial class Char1 : Form 
{ 
    private System.Timers.Timer aTimer; 

    public static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Mainprog.count += 1; 
    } 
    public Char1() 
    { 
     InitializeComponent(); 
     aTimer = new Timer(); 
     aTimer.Interval = 2000; 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
    } 

    private void checkBox1_CheckedChanged(object sender, EventArgs e) 
    { 
     if(checkBox1.Checked) 
     { 
      aTimer.Start(); 
     } 
     else 
     { 
      aTimer.Stop(); 
     } 
    } 
} 

так инстанцирует таймер в конструкторе, а также определить свой интервал там, если вы не хотите, чтобы изменить интервал, когда флажок установлен или снят.

1

Простейшее путь в настоящее время:

while(true) { 
    await Task.Delay (1000); 
    DoSomething(); 
} 
+0

На какой поток вы бы поставили этот цикл? –

+0

цикл будет выполняться в текущем потоке, но не будет препятствовать выполнению других операций. Читайте о TPL и async/await в .NET 4.5 –

+0

не 'await' необходимо использовать в методе' async'? –

0

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

TimerCallback tCb = Method; 

     Timer t = new Timer(tCb, null, 1000, 1000);   
    } 

    private void Method(object sender) 
    {  
     //your 
    } 

Он будет работать метод каждый второй (период) после ожидания одного второй (dueTime).

1

Ваш (недавно добавлен) код

while (checkBox1.Checked) 
    { 
     aTimer.Interval = 2000; 
     aTimer.Enabled = true; 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
    } 

содержит некоторые проблемы:

  • когда флажок установлен, то вы получите в бесконечный цикл (у вас нет времени, чтобы Непроверьте box)
  • В этом цикле вы продолжаете добавлять (+=) новых обработчиков событий к таймеру, так что если он загорается, вы сбрасываете тысячи звонков OnTimedEvent.

Решение: заменить while с if и убедитесь, что вы добавить, что OnTimedEvent только один раз, перемещая эту линию к построению формы.

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