Альтернатива Thread.Sleep в C #? - PullRequest
       0

Альтернатива Thread.Sleep в C #?

6 голосов
/ 02 февраля 2012

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

В настоящее время у меня это выглядит так:

//do work
Thread.Sleep(10800000);
//do work

Это, однако, останавливает программное обеспечение, и я думаю, что это потому, что время сна слишком велико.Я искал в Интернете, и я нашел другую работу под названием Timer.Может кто-нибудь показать мне пример кода для Timer, который работает так же, как Thread.sleep?

Заранее спасибо.

Редактировать: мне нужно, чтобы программное обеспечение подождало 3 часа, прежде чем продолжить с остальнымивыполнение кода.Это программное обеспечение предназначено для связи с компьютерами, и я не могу позволить остальной части кода выполняться в течение 3 часов.

Ответы [ 10 ]

6 голосов
/ 02 февраля 2012

См. этот справочник MSDN по System.Threading.Timer классу . Есть отличное объяснение, все ученики и пример кода, которому вы должны следовать при тестировании / обучении.

Имейте в виду, однако, Timer следует использовать, когда вы хотите запустить событие через определенный интервал. Если вы просто хотите приостановить выполнение вашего приложения, тогда вам следует использовать Thread.Sleep(). Однако, как отмечали многие другие, вы заставляете ваш поток спать в течение длительного времени.

4 голосов
/ 02 февраля 2012

ИСПОЛЬЗУЙТЕ ТАЙМЕР!

private DispatcherTimer Timer;
public Constructor
{
    Timer = new System.Windows.Threading.DispatcherTimer();
    Timer.Tick += new EventHandler(Timer_Tick);
    Timer.Interval = new TimeSpan(0,0,10);
    Timer.Start();
}


private void Timer_Tick(object sender, EventArgs e)
{
    Timer.Stop();
    Timer -= Timer_Tick;
    Timer = null;
    // DO SOMETHING
}
4 голосов
/ 02 февраля 2012

Ваше программное обеспечение зависнет, если этот сон находится в главном потоке.Имейте в виду, что параметр в миллисекундах.10 800 000 миллисекунд = 10 800 секунд

Другой способ передать время - передать объект TimeSpan.Пример:

// Sleep for 10 seconds
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10));

Что касается таймера:

Вы можете использовать System.Timers.Timer;

Timer timer = new Timer();
timer.Interval = 20; // milliseconds
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.AutoReset = true; // if not set you will need to call start after every event fired in the elapsed callback
timer.Start();
2 голосов
/ 02 февраля 2012

Ваша проблема в том, что вы блокируете основной поток вашего приложения, который отвечает за поддержание работы интерфейса.Ты не должен этого делать.Вместо этого используйте таймер - Forms, вероятно, самый простой в приложении Forms или рассмотрите BackgroundWorker.(Для такого долгого ожидания таймер, вероятно, более подходит)

2 голосов
/ 02 февраля 2012

Thread.Sleep - это то, что вы хотите использовать для этого, вы можете использовать более разумный период сна, чем 3 часа.

Обновление:

После прочтения некоторых комментариев Thread.Sleep, вероятно, не то, что вы хотите. Вместо этого используйте System.Threading.Timer, как предлагали другие.

1 голос
/ 07 апреля 2016

Вы можете заменить

Thread.Sleep(X);

на

Task.WaitAll(Task.Delay(X));
1 голос
/ 02 февраля 2012

Я думаю, вы должны использовать Монитор .Это поможет вам подождать с объектами и снять блокировку, когда вам нужно продолжить запуск программы.

Ответ вы найдете здесь: Безопасная синхронизация потоков

1 голос
/ 02 февраля 2012

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

Таймер обычно используется для периодического прерывания нормальной работы основного потока и обработкиevent.

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

Чего я не хотел бы, так это попросить основной поток не спать в течение 3 часов.

1 голос
/ 02 февраля 2012

Посмотрите Thread.Sleep (300) не работает правильно

Возможно, вам нужно использовать «Диспетчер».Взгляните здесь а

0 голосов
/ 02 февраля 2012

Вы спите нить в течение 10800 секунд или 3 часов. Thread.Sleep () предназначен для того, чтобы заморозить ваш поток, остановить что-либо от работы в программном обеспечении в течение этого времени. В этом случае продолжительность составляет 18 минут. Что ты пытаешься сделать?

...