Member 7695634 Ответов: 5

Как приостановить выполнение кода C# с помощью таймера


Всем привет,
Мне нужно остановить выполнение кода на некоторое время. Я использовал thread.sleep (), но в цикле он ведет себя неправильно и мгновенно выполняет следующие строки кода.
Например:

// If this is the first line 
string abc = "This is first line";

// and after that I want to pause the execution of the application for 5 seconds and 
// then want to execute below line.

MessageBox.Show(abc);


Пожалуйста, скажите мне любую альтернативу для thread.sleep().

PIEBALDconsult

Где же код? Вы понимаете, что сон занимает миллисекунды?

DamithSL

обновите вопрос с помощью вашего фактического кода

Philippe Mori

Почему бы не подождать 5 секунд, прежде чем отображать окно сообщения? Это не очень удобно для пользователя, так как пользователь не будет, почему ничего не происходит в течение этого времени.

Вам придется переосмыслить свой дизайн (как пользовательский интерфейс, так и код), чтобы сделать что-то более удобным.

Member 7695634

Спасибо Филиппу за ваше предложение. Кстати, я не пытаюсь отобразить сообщение через 5 секунд. Я привел пример просто для того, чтобы знать, что если есть какой-то способ приостановить выполнение кода на некоторое время.

5 Ответов

Рейтинг:
43

OriginalGriff

Вы можете - это не сложно:

Sleep(5000);
Будут делать это.

But...it-я запру ваш пользовательский интерфейс до тех пор, пока не пройдет время.
Если вы хотите сделать что-то еще в то время (или вам не нравится, что ваш пользователь думает, что ваше приложение разбилось), то я бы рассмотрел возможность использования таймера или даже фонового рабочего для этой длительной задачи


BillWoodruff

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

frostcox

асинхронность приходит на ум!!!

Рейтинг:
2

Afzaal Ahmad Zeeshan

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

// thread1 is your thread, for instance
thread1.Sleep(5000); // 5000ms = 5seconds


Это приостановило бы поток на 5 секунд.


Рейтинг:
1

Redgum

Если вы посмотрите на intellisense или на MSDN, поток.Функция Sleep() принимает аргумент, представляющий собой значение времени "сна" потока в миллисекундах.

Чтобы ваш код подождал 5 секунд, прежде чем показывать messagebox, попробуйте:

Thread.Sleep(5000);
MessageBox.Show(abc);



Вам нужно будет включить:

using System.Threading;


в противном случае в ваших пространствах имен используйте полный путь к методу:

System.Threading.Thread.Sleep(5000);


Ну, если по какой - то странной причине ваш thread.sleep() не работает (я бы очень хотел выяснить это, потому что это означает, что происходит что-то еще-скорее всего, у вас есть еще один поток, повторно вводящий какой-то метод), вы всегда можете попробовать это:

var waitTime = new TimeSpan(0, 0, 5);
var waitUntil = DateTime.Now + waitTime;

while(DateTime.Now <= waitUntil)
{
    System.Threading.Thread.Sleep(1000);
    // .
    // .
    // .
}

MessageBox.Show(abc);


Если это все еще не работает, у вас есть другие проблемы либо в коде, либо в вашей системе.


Member 7695634

Большое спасибо, ребята, за ваши ответы, и я очень сожалею о (печатной) ошибке, которую я сделал в вышеприведенном вопросе. Я знаю эту нить.Метод Sleep() принимает аргумент, и я использовал Thread.Сон(5000). Но я действительно не знаю, почему это не работает. Как я уже сказал, код находится в цикле for. Изначально thread.sleep(5000) реагирует точно, но после 10 записей он выполняет код очень быстро (даже меньше секунды). Почему это происходит, я не знаю.

Рейтинг:
1

Member 13822029

private async void Function()
{
string message = "Hello world!";
await Task.Delay(3000);
MessageBox.Show(message );
}

попробовать это


CHill60

Вы ничего не добавили к теме, которая еще не была упомянута

Рейтинг:
0

Manas Bhardwaj

Нить.Спать[^] должно работать просто отлично.

Для начала посмотрите на приведенный ниже код:

string message = "Hello world!";

for (int count = 0; count < 10; count++)
{
    Console.WriteLine(string.Format("{0}: {1}", count, message));

    //wait for 2 seconds
    Thread.Sleep(2000);
}