У меня есть веб-страница 4.0 с нажатием кнопки, которая запускает процесс на стороне сервера, который занимает около 5-10 секунд. Я подумал, что буду умен, и искал какой-нибудь код, который скрывал кнопку и отображал анимированное GIF-изображение во время работы процесса.
Я получил это, но начал замечать ошибки «файл используется другим процессом» выбрасывается на серверную часть (частью процесса является удаление каталога). Я прошел отладку и начал видеть то, что, казалось, было вторым нажатием кнопки при одновременном срабатывании. Оказывается, что фрагмент кода Js, который я добавил, чтобы обновить страницу, чтобы запустить анимированный GIF, кажется, запускает событие щелчка сервера во второй раз. Мне пришлось вызвать метод Js SetTimeOut (), чтобы запустить изображение GIF, именно это, кажется, вызывает проблему.
Я немного искал, чтобы попытаться найти другой подход к запуску анимированного GIF-файла, но не смог его найти, поэтому я остановился на машине скорой помощи в нижней части скалы и решил добавить метку времени на стороне сервера в сеанс и продолжайте работу с моим кодом, только если он более 20 секунд с момента последнего сеанса.
У меня были некоторые очень ошибочные результаты с этим подходом, и любой вклад будет оценен.
- Есть ли лучший способ, как я могу запустить gif?
- Кто-нибудь еще сталкивался с этой проблемой стрельбы дважды?
- Почему мой замок не работает с первого раза?
Любое предложение о лучшем подходе к этому приветствуется, спасибо!
Результаты регистрации:
Первый раз (сессия не существует)
2011-06-21 11: 46: 14.8968 | DEBUG | FileViewer.copyfiles | Count = 1 & Locked = False
2011-06-21 11: 46: 14.8968 | DEBUG | FileViewer.copyfiles | Count = 2 & Locked = True
2011-06-21 11: 46: 19.0619 | DEBUG | FileViewer.copyfiles | Count = 1 & Locked = False
2011-06-21 11: 46: 19.0619 | DEBUG | FileViewer.copyfiles | Count = 2 & Locked = True
2011-06-21 11: 46: 23.1959 | DEBUG | FileViewer.copyfiles | Count = 3 & Locked = True
2011-06-21 11: 46: 28.8119 | DEBUG | FileViewer.copyfiles | Count = 3 & Locked = True
Запустить снова:
2011-06-21 11: 49: 47.7798 | DEBUG | FileViewer.copyfiles | Count = 1 & Locked = False
2011-06-21 11: 49: 47.7798 | DEBUG | FileViewer.copyfiles | Count = 2 & Locked = True
2011-06-21 11: 49: 55.9697 | DEBUG | FileViewer.copyfiles | Count = 3 & Locked = True
2011-06-21 11: 49: 59.8697 | DEBUG | FileViewer.copyfiles | Count = 1 & Locked = True
2011-06-21 11: 49: 59.8697 | DEBUG | FileViewer.copyfiles | Count = 3 & Locked = True
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
PostBackOptions optionsSubmit = new PostBackOptions(btnGo);
btnGo.OnClientClick = "HideControlOnClick(this);";
btnGo.OnClientClick += ClientScript.GetPostBackEventReference(optionsSubmit);
}
}
protected void btnGo_Click(object sender, EventArgs e)
{
bool locked = true;
if (Session["ClickTime"] == null || (DateTime)Session["ClickTime"] < DateTime.Now.AddSeconds(-20))
{
Session["ClickTime"] = DateTime.Now;
locked = false;
}
WriteToLog(1, locked);
if (Page.IsValid && !locked)
{
locked = true;
WriteToLog(2, locked);
// Do all my processing
}
WriteToLog(3, locked);
}
<script language="javascript" type="text/javascript">
function HideControlOnClick(btnGo)
{
// IE uses className for the css property.
btnGo.setAttribute('className', 'hide');
document.getElementById('MainContent_imgWait').setAttribute('className', 'show');
setTimeout("UpdateImg('MainContent_imgWait','Images/loading.gif');",50);
}
function UpdateImg(ctrl, imgsrc)
{
var img = document.getElementById(ctrl);
img.src = imgsrc;
}
</script>