Отображать сообщение о загрузке при экспорте набора результатов в Excel
-
22-08-2019 - |
Вопрос
Я использую ASP.NET и C # и экспортирую очень большой набор результатов в Excel.Пока мой код экспорта запущен, я хотел бы показать "загружающийся" анимированный gif-файл, чтобы пользователи знали, что их запрос обрабатывается.Я пытался сделать это с помощью многопоточности, но я не очень хорошо знаком с этим.Кто-нибудь может направить меня в правильном направлении?Спасибо!
Джон
Решение
Вы пытаетесь выполнить многопоточность на сервере?Что я бы порекомендовал, так это включить в вашем клиентском javascript сообщение "пожалуйста, подождите" перед отправкой на сервер.Затем на стороне клиента, когда вы закончите публикацию, вы отключите сообщение.
Не зная больше о вашей реальной настройке, я не могу больше помочь, но в прошлый раз, когда я реализовывал это, я сделал что-то в этом роде:
Предположим, у нас есть div с именем PrintLoadingPanel с помощью JQUERY я настраиваю div на отображение и переношу окно:
$("#printLoadingPanel")
.css({display:"block",top:"0px",left:"0px",height:screen.availHeight});
Затем я запущу таймер с интервалом в 1/2 секунды, который начнет проверять, закончили ли мы печать.Я только создаю и загружаю небольшие PDF-файлы, поэтому мне нужен был более быстрый ответ.Если ваш отчет действительно медленный, вы можете захотеть изменить это:
window.setTimeout(checkIfDoneDownload,500);
Затем моя функция CheckIfDoneDownload обращается к серверу и проверяет, завершили ли мы генерацию файла и загрузили ли его.Здесь я снова использую JQUERY для вызова службы WCF с поддержкой AJAX.Вы могли бы заменить это с помощью PageMethods или любым другим способом обратного вызова сервера.
function checkIfDoneDownload()
{
$.ajax({
type: "POST",
url: "../Services/Utilities.svc/IsPrintDownloadDone",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
if (msg.d)
{
$("#printLoadingPanel").css("display","none");
}
else {window.setTimeout(checkIfDoneDownload,500);}
},
error: function (xhr, textStatus, errorThrown) {
if (xhr.status==12030) {checkIfDoneDownload();}
}
});
}
Теперь на стороне сервера я генерирую свои загрузки с помощью HTTP-обработчика.По сути, первое, что он делает, это устанавливает флаг уровня сеанса в false, затем последнее, что он делает, это возвращает ему значение true.Моя служба проверки выполнения просто возвращает значение флага.
Другие советы
Я столкнулся с такой же проблемой при создании отчетов.Простым решением было бы запустить отчет ночью, а затем записать его на сервер.Затем предоставьте ссылку на отчет.
Если вы в состоянии использовать ASP.NET AJAX, то я бы рекомендовал использовать UpdateProgress
контроль (вместе с UpdatePanel
).
Если вам нужно красивое анимированное gif-изображение, тогда ознакомьтесь Загрузка Ajax.