Ищете простую альтернативу Thread.Sleep - PullRequest
7 голосов
/ 17 мая 2010

HI

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

Теперь я хочу заменить их на что-нибудь более стильное и правильное.

Есть ли у кого-нибудь простой способ «ждать» устройства, а не спать, имея в виду, что устройство не дает нам знать, когда оно будет готово, поэтому ожидание примерно так же хорошо, как мы можем! ??

С уважением, Джордж.

Ответы [ 4 ]

7 голосов
/ 17 мая 2010

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

У вас есть как минимум два варианта System.Timers.Timer или System.Threading.Timer.

Тем не менее, это, вероятно, означает, что вам придется больше участвовать в многопоточности, чтобы таймер мог уведомить остальную часть вашей программы о продолжении работы, когда устройство будет готово (например, с помощью WaitHandle или какого-либо другого типа как AutoResetEvent).

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

3 голосов
/ 18 мая 2010

Я предпочитаю использовать Monitor.Wait над Thread.Sleep в большинстве случаев, потому что в отличие от Thread.Sleep его можно разблокировать с помощью Monitor.Pulse, если это необходимо. Хорошее объяснение того, почему Thread.Sleep следует использовать разумно, см. http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx

1 голос
/ 17 мая 2010

Пока вы делаете вызовы из фонового потока, это, вероятно, не самый страшный способ сделать это. Вы могли бы также использовать таймер для обратного вызова после интервала; более сложный (не очень), но, возможно, его легче отменить (конечно, вы также можете просто обработать прерывание потока, чтобы отменить сон).

1 голос
/ 17 мая 2010

Лучший способ заставить приложение ждать - это использовать Thread.Sleep()

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

Нет ли способа, чтобы ваше приложение могло попытаться продолжить работу и повторить попытку в случае сбоя из-за состояния устройства? (Конечно, должно быть максимальное количество попыток)

...