Чем заменить thread sleep

Альтернативы для Thread.Sleep ()

Каждые N минут мы хотим выполнить список задач. Итак, мы создали исполнителя задач с

Так есть ли альтернатива или я нашел правильное использование Thread.Sleep?

Ссылка на объект требуется для нестатическое поле, метод или имущество ‘System.Threading.WaitHandle.WaitOne (System.TimeSpan)’

10 ответов

Я использую этот фрагмент:

Хотя для этого конкретного сценария таймер, вероятно, будет более подходящим подходом:

Edit

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

Три варианта, которые я могу придумать: «

Вы можете использовать ManualResetEvent, который вы установили, когда пришло время остановиться, а затем сделать на нем WaitOne.

Я бы использовал таймер ожидания, который сигнализирует AutoResetEvent. Ваш поток должен ждать этого объекта WaitHandle. Вот небольшое консольное приложение, демонстрирующее этот подход:

Если все ваши темы делают что-то вроде:

Тогда я бы предложил не использовать поток вообще. Во-первых, нет особой причины нести системные издержки выделенного потока, который большую часть времени проводит в спящем режиме. Во-вторых, если вы установите флаг stop_working через 30 секунд после того, как поток перестанет спать, вам придется подождать четыре с половиной минуты, прежде чем поток просыпается и завершается.

Я бы посоветовал, как и другие: использовать таймер:

Вы можете использовать System.Timers.Timer и выполнить работу в его обработчике.

Как говорили другие ответчики, таймеры могут хорошо сработать для вас.

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

Я использовал и Timer в приложении WinForms, и консольное приложение, периодически запускаемое ScheduledTask на сервере. WinForms с таймером использовался в тех случаях, когда я хочу, чтобы он выскакивал уведомления о том, что он запущен и что он обнаружил (я установил их для уменьшения до системного). В тех случаях, когда я хочу получать уведомления только в том случае, если на сервере что-то идет не так, я помещаю их на сервер в виде консольных приложений и запускаю как запланированные задачи. Кажется, это работает очень хорошо.

Я думаю, что пытался использовать Sleep в приложениях, где я сейчас использую таймеры, и мне не понравился результат. Во-первых, используя таймер, я могу очень легко вызвать свернутое приложение, чтобы установить или изменить настройки на передней панели. Если приложение спит, у вас возникают проблемы с восстановлением доступа, пока оно спит.

Источник

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

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

В настоящее время у меня есть это как

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

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

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

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

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

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

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

Возможно, вам нужно использовать “Диспетчер”. Посмотрите здесь, а также

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

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

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

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

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

Источник

Alternatives to Thread.Sleep()

Every N minutes we want to run through a list of tasks. So we’ve created a task executor with a

Now we want to have a pause between work cycles. Everyone seems to think Thread.Sleep() is the devil. I’ve seen mention of using Monitor/Event stuff but we don’t have someone else telling us to do work. We just want to do stuff every N minutes like clockwork.

So is there an alternative or have I found a valid use of Thread.Sleep?

Someone in another post mentioned WaitHandle.WaitOne() as an alternative but you can’t call that from a non-static method apparently? Or at least I can’t because I get a compile time error of..

An object reference is required for the non-static field, method, or property ‘System.Threading.WaitHandle.WaitOne(System.TimeSpan)’

Чем заменить thread sleep. Смотреть фото Чем заменить thread sleep. Смотреть картинку Чем заменить thread sleep. Картинка про Чем заменить thread sleep. Фото Чем заменить thread sleep

11 Answers 11

By my understanding, Thread.Sleep() is bad because it forces the thread’s resources out of the cache, so they have to be loaded again afterwards. Not a big deal, but it could aggravate performance issues in high-load situations. And then there’s the fact that the timing isn’t precise, and that it effectively can’t wait for durations under about 10ms.

I use this snippet:

Although, for this specific scenario, a Timer would probably be a more appropriate approach:

Edit:

Чем заменить thread sleep. Смотреть фото Чем заменить thread sleep. Смотреть картинку Чем заменить thread sleep. Картинка про Чем заменить thread sleep. Фото Чем заменить thread sleep

For regular work tasks you might want to look at using a Timer (either System.Threading.Timer or System.Timers.Timer ) or possibly even Quartz.NET.

That being said, most of the time, operations like this are better suited towards using a Timer.

Чем заменить thread sleep. Смотреть фото Чем заменить thread sleep. Смотреть картинку Чем заменить thread sleep. Картинка про Чем заменить thread sleep. Фото Чем заменить thread sleep

The three options that I can think of off the top of my head are :

You could use an ManualResetEvent that you set when it’s time to stop, and then do a WaitOne on it.

I would use a waiting timer which signals an AutoResetEvent. Your thread should wait for this WaitHandle object. Here is a small console app showing this approach:

Чем заменить thread sleep. Смотреть фото Чем заменить thread sleep. Смотреть картинку Чем заменить thread sleep. Картинка про Чем заменить thread sleep. Фото Чем заменить thread sleep

Чем заменить thread sleep. Смотреть фото Чем заменить thread sleep. Смотреть картинку Чем заменить thread sleep. Картинка про Чем заменить thread sleep. Фото Чем заменить thread sleep

If all your thread is doing is something like:

Then I would suggest not using a thread at all. First, there’s no particularly good reason to incur the system overhead of a dedicated thread that spends most of its time sleeping. Secondly, if you set the stop_working flag 30 seconds after the thread stops sleeping, you’ll have to wait four and a half minutes before the thread wakes up and terminates.

I’d suggest as others have: use a timer:

You could use a System.Timers.Timer and perform the work in its elapse handler.

Чем заменить thread sleep. Смотреть фото Чем заменить thread sleep. Смотреть картинку Чем заменить thread sleep. Картинка про Чем заменить thread sleep. Фото Чем заменить thread sleep

As other answerers have said, Timers may work well for you.

If you do want your own thread, I wouldn’t use Thread.Sleep here, if only because if you need to shut down the application, there’s no good way to tell it to exit the sleep. I’ve used something like this before.

I’ve used both a Timer in a WinForms application and a console app started periodically by a ScheduledTask on a server. The WinForms with a timer has been used in cases when I want it to pop up notifications that it ran and what it found (I’ve set these to mimize to the systray). For situations where I only want to be notified if something goes wrong on a server, I’ve put them on the server as console apps and run them as Scheduled Tasks. That seems to work quite well.

I think I tried using Sleep in the apps where I now use Timers, and didn’t like the result. For one thing, using a Timer I am able to call up the minimized app very easily in order to set or change settings on the front. If the app is asleep, you have difficulty regaining access while it is slumbering.

Чем заменить thread sleep. Смотреть фото Чем заменить thread sleep. Смотреть картинку Чем заменить thread sleep. Картинка про Чем заменить thread sleep. Фото Чем заменить thread sleep

Not the answer you’re looking for? Browse other questions tagged c# multithreading or ask your own question.

Linked

Related

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.12.16.41042

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Более точная альтернатива Thread.Sleep(1)

Принципиальная схема говнокодерская и выглядит так:

Как использовать Thread.Sleep(5000), ошибка: «Элемент «Thread» не существует в текущем контексте»
я так понимаю, что Thread.Sleep(5000); это «тормоз» процесса выполенения программы на 5 сек? А.

Чем заменить thread sleep. Смотреть фото Чем заменить thread sleep. Смотреть картинку Чем заменить thread sleep. Картинка про Чем заменить thread sleep. Фото Чем заменить thread sleepThread.Sleep и lock
Что будет если вызвать Thread.Sleep() внутри блока кода lock?

Thread.Sleep не работает
Всем привет! Задача такая есть таймер который запускается каждый 30 сек и делает рассылку и.

Аналог Thread.Sleep в Task
Имеется пример который запускает пару потоков с задержкой. using System; using.

«Кроме того, задержка самого потока тоже тормозит его работу на 15 мс в случае, если delay не равна нулю.»

Для этого случая вот так думаю:

Psilon, какой из таймеров использовать? Почему ManualResetEvent, а не Auto?

Я попробовал примерно следующую схему:

Проблема решилась использованием multimedia timers:

Поток засыпает ровно на 1 мс, потом возвращается в начало цикла и повторяет работу. Загрузка ЦП меньше 1%.

Однако это не лучший вариант, на мой взгляд. Особенно потому, что не рекомендуется использовать больше 4 мультимедиа таймеров в одном приложении, т.к. это может привести к лагам в системе.
Хотелось бы всё-таки обойтись встроенными дотнэтовскими средствами, особенно потому что это некрасиво, когда одна строчка:

Видимо, я плохо описал задачу, или мы просто не понимаем друг друга.

У меня есть поток, в бесконечном цикле читающий из com-порта данные побайтово. Кроме того ещё ряд потоков, симулирующих устройства. И как Вы предполагает заставить читающий с порта поток работать с задержкой в 1мс, воткнув в тело его цикла вашу конструкцию с таймером? Или любой другой поток?
Задача то в том, чтобы поток выполнил некую повторяющуюся операцию или проверку, затем в конце цикла уснул ровно на 1мс,отпустив тем самым cpu, а затем вернулся в начало цикла и сделал проверку вновь, и так до бесконечности.

Кроме того, не стоит игнорировать тот факт, что:

Это вопрос другого топика

Источник

чем заменить thread.sleep

У меня есть for loop как часть фонового потока в моем коде. На полпути выполнения кода в цикле мне нужен период ожидания, поэтому я вызываю thread.sleep. Я обнаружил, что если дисплей телефона закрывается в течение периода ожидания, время ожидания становится неустойчивым. Согласно документации, сон не является надежным временем. Поэтому я задаюсь вопросом, что заменить. Насколько я могу видеть, если я создам субпоток post delayed, я потеряю непрерывность внутри for loop. Надеюсь, я ошибаюсь и правильно понял механику-любая помощь оценена по достоинству. Рон

3 ответа

Я пытаюсь заменить Thread.Sleep на System.Threading.Timer и пытаюсь реализовать его в следующем коде. Основная причина изменения заключается в том, что, хотя он работает при локальном тестировании, он не работает должным образом на сервере. Кроме того, я читал, что использовать его здесь-плохая.

Вам нужно что-то вроде этого:

В чем разница между Thread.sleep(9000l); и Thread.sleep(9000); Имеет ли это значение и разницу во времени сна нити или это одно и то же.

Таким образом, я узнал, что мое предыдущее решение иметь Thread.Sleep во всем моем консольном приложении C# (из-за ожидания веб-страниц, чтобы сделать то, что я всегда не могу достичь с обычным WebDriverWaits из Selenium/Chromedriver), не является хорошим решением, потому что оно замораживает весь.

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

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *