Во-первых, я не задаю тот же вопрос, что С# - Альтернатива Thread.Sleep? или Альтернатива Thread. Сон в С#?. Я не думаю, что использую его неправильно и нуждаюсь в подлинной альтернативе для конкретных ситуаций.
Во время анализа кода я увидел удивительное нарушение:
Использование Thread.Sleep() является признаком ошибочной конструкции.
Это нарушение приводит к статье Питера Ричи о том, почему именно это составляет плохую конструкцию.
Мы все знаем, что создание потоков дорого, а блокировка потоков - это соперничество в пуле. Мы также знаем, что каждый поток будет выделять мегабайт памяти, поэтому он должен иметь короткий срок службы, блокировка пользовательского интерфейса - это зло, использование сна для синхронизации ненадежное и т.д. И т.д. И т.д. Это приводит меня к моей точке, если вам действительно нужно выполнить спать, что вы должны использовать, если не Thread.Sleep?
Далее Питер упомянул, что нулевой сон является единственным правильным использованием Thread.Sleep, эффективно отказывающимся от потока времени и позволяя другим потокам обрабатывать. И еще более страшно, что это только из-за ограничений на неуправляемые потоки, и если их повторная реализация в CLR создаст побочные эффекты использования Thread.Sleep в ваших приложениях. Все точки общего плохого использования, на самом деле, являются хорошими примерами плохого использования.
У меня есть следующие ситуации в производственном коде, который использует Thread.Sleep довольно успешно:
- Ожидание блокировки файла операционной системой (проблемы с блокировкой файлов catch, ожидание второй, повторите попытку, отпустите через некоторое время).
- Убив процесс и ожидая его появления в списке процессов (убейте его, убедитесь, что он не работает, подождите второй, убедитесь, что он еще не запущен, заставьте его закрыть).
- Ожидание буферов копирования для очистки (проверьте размер файла, попробуйте его получить, wait, проверьте, изменился ли размер).
Без использования Thread.Sleep в таких ситуациях, какие у меня есть другие варианты? Плотные циклы, как правило, ухудшают ситуацию, и я не верю, что это делает использование "недостатком дизайна", особенно потому, что в пользовательском интерфейсе ничего не происходит и только в фоновом режиме. Просто природа программного обеспечения ждет других вещей в многопоточной среде с внешними факторами, влияющими на ваш код, иногда вам нужно ждать...