Сон потока в С#

В порядке. Я вызываю внешний скрипт [Изменить: веб-сервис], который выполняет асинхронную задачу. Обычно это занимает одну-две минуты.

Тем временем я хочу отобразить пользователю сообщение «подождите», так как мне нужно сделать еще один вызов, чтобы проверить, была ли завершена предыдущая задача, прежде чем я продолжу.

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

Итак, вопрос, который у меня есть, заключается в том, будет ли thread.sleep переводить в спящий режим все веб-приложение или только одно для текущего пользовательского интерфейса?

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

Я использую iis 7 на windows 2008 r2

Спасибо


person robert    schedule 12.08.2013    source источник
comment
BackgroundWorker   -  person Jonesopolis    schedule 13.08.2013
comment
Как вы вызываете свой сценарий и что это за сценарий? Вызов внешнего процесса прост, и вы можете легко определить, когда он заканчивается (класс Process).   -  person Nayan    schedule 13.08.2013
comment
@Jonesy: в данном случае не подходит, ИМО.   -  person Jon Skeet    schedule 13.08.2013
comment
Если вам нужно Thread.Sleep, скорее всего что-то не так в вашем дизайне.   -  person I4V    schedule 13.08.2013
comment
@Nayan - это внешний веб-сервис на другом сайте.   -  person robert    schedule 13.08.2013


Ответы (3)


Thread.Sleep повлияет только на текущий поток, но в любом случае это не то, что вы хотите сделать.

Вы должны вернуть полный ответ от своего веб-приложения, но тот, который запускает таймер Javascript через несколько секунд, а затем выполняет обратный вызов AJAX в ваше веб-приложение, чтобы проверить, завершена ли задача. (Вы должны включить в свой ответ своего рода «идентификатор задачи», чтобы сервер знал, какую задачу проверять.)

Если вы просто засыпаете перед возвратом ответа, ваш пользователь не увидит никакого сообщения, пока засыпание не завершится.

person Jon Skeet    schedule 12.08.2013
comment
Что ж. Я буду делать это через UpdatePanel... так что, я думаю, должно появиться сообщение «подождите» в пользовательском интерфейсе? - person robert; 13.08.2013
comment
@robert: Не могу сказать, что много знаю о UpdatePanel, но вы все равно хотите, чтобы сон происходил на стороне клиента, а не на стороне сервера. Здесь нет смысла заставлять поток на стороне сервера спать. - person Jon Skeet; 13.08.2013

Было бы неплохо больше информации. Тем не мение:

Я предполагаю, что вы собираетесь создать веб-сайт (asp.net mvc или веб-формы), так как вы используете iis7. Просто запустите сервер и позвольте клиенту использовать вызов Ajax, чтобы узнать статус задачи. Законченная задача должна где-то храниться, предпочтительно в базе данных. Вы также можете использовать xml или что-то еще, чтобы иметь точку, в которой вы можете сохранить идентификатор задачи, а также завершить ее или нет. И просто позвольте ajax выполнять вызов каждые 5 секунд, пока он не вернется к заданию true при завершении.

person Maximc    schedule 12.08.2013

Вы не должны использовать Thread.Sleep. Предположим, что это веб-приложение...

Один запрос должен запускать задачу и возвращать токен задания.

С помощью другого запроса пользователь должен иметь возможность проверить статус этого задания (путем передачи токена).

Когда задание завершено, пользователь должен иметь возможность получить результат задания (передав токен).

person Cakez0r    schedule 12.08.2013