2014-11-20 6 views
-3

Я понятия не имел, как создать это сообщение с хорошим заголовком, поэтому заранее извиняюсь.Вызов метода несколько раз, который использует System.Timers.Timer?

Я использую System.Timers.Timer следующим способом для паузы в течение определенного времени. По сути, я создаю экземпляр класса только один раз, а затем вызываю следующий метод TestDelay() несколько раз с разными значениями Double.

Проблема с созданием экземпляра ToErase один раз, но при вызове TestDelay() два раза - это то, что задержка не выполнена. С другой стороны, если я дважды создаю экземпляр класса ToErase и вызываю TestDelay() один раз за каждый экземпляр, то задержка выполняется. Я предполагаю, что это связано с частной задержкой, которая делится в одном экземпляре.

Мой вопрос, как мне нужно изменить этот класс, чтобы я мог создать экземпляр ToErase только один раз и вызвать TestDelay() несколько раз?

Я считал Thread.Sleep(), но он полностью поддерживает консольное приложение, включая любые другие экземпляры TestDelay(), которые могут быть запущены на данный момент.

Вот мой код:

class ToErase 
{ 
    private System.Timers.Timer Delay; 
    private ManualResetEventSlim ev = new ManualResetEventSlim(false); 
    public void TestDelay(Double ms) 
    { 

     Console.Write("."); 

     ev = new ManualResetEventSlim(false); 

     //TimeSpan span = DateTimeRun.AddMinutes(Offset).Subtract(now); 
     Delay = new System.Timers.Timer(ms); 
     Delay.Enabled = true; 

     Delay = new System.Timers.Timer(ms); 
     Delay.Elapsed += Delay_Elapsed; 
     Delay.Enabled = true; 
     while (Delay.Enabled) 
     { 
      string s = ""; 
      ////Wait until time passes 
     } 
     Console.WriteLine("Timer completed for QTR"); 
    } 
    private void Delay_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     Delay.Enabled = false; 
     ev.Set(); 
    } 

} 
+0

Как этот код _not_ выполняет то же, что и 'Thread.Sleep()'? Метод 'TestDelay()' не возвращается до истечения срока действия вашего таймера, что является тем же самым поведением 'Thread.Sleep()' has. См. Http://stackoverflow.com/help/mcve для получения информации о характеристиках примера кода _good_. –

+1

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

+1

Вряд ли кто-то пропустил - проголосовал за вас «просто чтобы сделать точку». Даун-голосования на SO имеет подлинный смысл и практические причины для происходящего; это не просто механизм для людей, чтобы выразить свое мнение (хотя это может быть один побочный эффект). Вы должны позаботиться о том, чтобы не делать предположений о мотивациях других. И, возможно, вы должны потратить свое время более продуктивно; было бы лучше сосредоточиться на улучшении вашего вопроса, чем жаловаться на реакцию сообщества на ваш вопрос. –

ответ

0

Есть много вещей неправильно с этим классом. Я предполагаю, что вы новичок в программировании OO.

Thread.Sleep - это то, что вы хотите. Нет причин писать свою собственную функцию.

Вы говорите, что Thread.Sleep() «спит для всего консольного приложения». Если вы заработаете свой класс, он также задержит «все консольное приложение», но это будет хуже, потому что он будет вращать процессор все время.

Формулировка в вашем вопросе заставляет меня подозревать, что вы работаете с несколькими потоками. Если вы заметили, что Thread.Sleep приостанавливает основной поток, но TestDelay этого не делает, причина, вероятно, в том, что вы вызываете разные функции.

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

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