Это зависит от многих вещей, поэтому трудно дать конкретный ответ из того, что вы сказали. Тем не менее, вот некоторые вопросы, которые могут иметь отношение к делу:
Вы делаете это в потоке пользовательского интерфейса (например, в потоке кнопки формы или события пользовательского интерфейса, который инициировал начатую работу)? Если это так, может быть лучше создать новый поток для выполнения работы.
Почему ты вообще спишь? Если состояние, относящееся к текущей работе, доступно всем соответствующим потокам, может ли наблюдатель не просто наблюдать это без спящего рабочего потока? Возможно, рабочий поток мог бы записать индикатор текущего прогресса в энергозависимую или заблокированную переменную (он должен быть заблокирован, если он больше, чем размер указателя - например, int или объект - но не иначе. Если не заблокирован, то энергозависимость предотвратит кэш-память несоответствие между процессорами, хотя это может и не иметь большого значения). В этом случае у вас может быть таймер форм (в .Net существуют разные таймеры для разных целей), который проверяет состояние этой переменной и обновляет пользовательский интерфейс, чтобы отразить выполняемую работу, без необходимости что-либо делать рабочему потоку. В лучшем случае может оказаться полезным Yield()
в рабочем потоке, но вряд ли это понадобится.