Сон C# для 500 миллисекунд

Вы могли сказать мне, как я иду о приостанавливании моей программы для 500 миллисекунд и затем продолжаю?

Я читал Thread.Sleep(500) не хорошо, поскольку это держит поток GUI.

Используя таймер это запускает обратный вызов...

Я просто хочу ожидать 500 мс и затем продолжиться к следующему оператору.

Советуйте.

Править: Я должен отобразить сообщение строки состояния для 500 мс и затем обновить сообщение с другим. Извините, я имел в виду 500 не 50.

Править: Я действительно понимаю то, что все Вы сказали. но: [Я просто хочу ожидать 500 мс и затем продолжиться к следующему оператору.] Я думаю, потому что это - такой короткий интервал, я иду, делают Поток. Сон (500) на основном потоке GUI. Иначе я должен был бы переписать много кода для размещения этого краткого интервала 500 миллисекунд.

Править: я попытаюсь переформатировать свое сообщение о состоянии, таким образом, пауза будет не нужна.

7
задан iTEgg 27 March 2010 в 22:12
поделиться

6 ответов

Hmya, то, что вы пытаетесь сделать, в корне несовместимо с моделью программирования Windows. Родная программа Windows управляется событиями. Ваша программа всегда простаивает, сидит внутри цикла, запущенного Application.Run(), и ждет, пока Windows сообщит ей, что произошло что-то интересное, на что она должна отреагировать. Запросы Paint, щелчки мыши, истечение таймера и тому подобное.

Ваша программа должна реагировать на это и фильтровать то, что вам интересно. Когда вы помещаете кнопку на форму, вас всегда интересует событие Click, генерируемое, когда Windows посылает уведомление MouseDown. Ваш обработчик события Click запускает какой-то пользовательский код, который вы пишете. Например, обновление сообщения строки состояния в вашем случае.

Обновление сообщения строки состояния полсекунды спустя не имеет особого смысла. Что именно произошло за эти 500 миллисекунд, что изменило то, как ваша программа реагирует на события? Вы можете вызвать метод Update() строки состояния, чтобы новое сообщение стало видимым, а затем вызвать System.Threading.Thread.Sleep(500), чтобы получить то, что вы хотите. Вам это сойдет с рук: призрак "Not Responding", который выставляет Windows, заставит вашу программу замолчать на несколько секунд.

Но в этом нет особого смысла, за эти полсекунды ничего не произошло, состояние вашей программы не изменилось. Она не могла измениться, она была мертва для Windows и не получала никаких сообщений, которые позволили бы ей изменить состояние.

Ну, это все, что я могу сказать по этому поводу. Пожалуйста, обновите свой вопрос и объясните, зачем вам это нужно. На всякий случай: если вы задумали это, чтобы притворяться, что делаете что-то важное в течение половины секунды, ваш пользователь не будет впечатлен. В конце концов, она заметит, что ваш пользовательский интерфейс завис на полсекунды, ничего не показав.

6
ответ дан 6 December 2019 в 09:59
поделиться

Было бы полезно добавить больше контекста к вопросу.

Thread.Sleep (50) приостанавливает текущий поток на 50 миллисекунд. Если вы делаете это в потоке пользовательского интерфейса, то да, он заморозит пользовательский интерфейс на 50 миллисекунд. Однако, если вы используете другой поток для выполнения этой обработки, то вызов Sleep в этом потоке приостановит его на 50 миллисекунд без остановки вашего потока пользовательского интерфейса.

См. Ответ Марка на этот вопрос для примера использования экземпляра BackgroundWorker для выполнения необходимых действий.

2
ответ дан 6 December 2019 в 09:59
поделиться

В C # лучше всего использовать таймер и запускать обратный вызов.

В F # есть отличный способ делать то, что вы хотите, см.

F # async на стороне клиента

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

2
ответ дан 6 December 2019 в 09:59
поделиться

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

  • Использовать таймер, как вы предложили. Разделите свой метод на два метода: foo1 и foo2. Используйте foo1, чтобы запустить таймер, и запустите foo2 в обратном вызове.
  • Используйте BackgroundWorker для запуска всей функции и используйте Thread.Sleep в рабочем потоке.

Судя по вашему обновлению, единственное, что вы хотите сделать, это изменить одно поле. Я бы определенно рекомендовал первый способ: использование таймера. Запуск BackgroundWorker для этой задачи является излишним и просто приведет к ненужной дополнительной работе и осложнениям.

5
ответ дан 6 December 2019 в 09:59
поделиться

Вместо того, чтобы приостанавливать пользовательский интерфейс непосредственно на 500 мс, вы всегда можете использовать BackgroundWorker . Это приведет к тому, что ваш обратный вызов будет выполняться в отдельном потоке, где вы можете использовать Thread.Sleep , чтобы приостановить его, не блокируя пользовательский интерфейс. Затем, когда вы закончите, просто обновите строку состояния новым сообщением.

4
ответ дан 6 December 2019 в 09:59
поделиться

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

0
ответ дан 6 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: