У меня есть блокировка в моем веб-приложении на C #, которая не позволяет пользователям запускать скрипт обновления после его запуска.
Я думал, что поместил бы уведомление на свою главную страницу, чтобы пользователь знал, что данные еще не все.
В настоящее время я так блокирую.
protected void butRefreshData_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ParameterizedThreadStart(UpdateDatabase));
t.Start(this);
//sleep for a bit to ensure that javascript has a chance to get rendered
Thread.Sleep(100);
}
public static void UpdateDatabase(object con)
{
if (Monitor.TryEnter(myLock))
{
Updater.RepopulateDatabase();
Monitor.Exit(myLock);
}
else
{
Common.RegisterStartupScript(con, AlreadyLockedJavaScript);
}
}
И я не хочу делать
if(Monitor.TryEnter(myLock))
Monitor.Exit(myLock);
else
//show processing labal
Насколько я понимаю, существует небольшая вероятность того, что он может отображать уведомление, когда оно фактически не запущено.
Есть ли альтернатива, которую я могу использовать?
Изменить:
Всем привет, большое спасибо за ваши предложения! К сожалению, я не мог заставить их работать ...
Однако я объединил идеи по двум ответам и придумал собственное решение. Кажется, пока он работает, но мне нужно дождаться завершения процесса ...
Хорошо, похоже, это работает, я выделил метод Repopule в его собственный класс.
public static class DataPopulation
{
public static bool IsUpdating = false;
private static string myLock = "My Lock";
private static string LockMessage = @"Sorry, the data repopulation process is already running and cannot be stopped. Please try again later. If the graphs are not slowly filling with data please contact your IT support specialist.";
private static string LockJavaScript = @"alert('" + LockMessage + @"');";
public static void Repopulate(object con)
{
if (Monitor.TryEnter(myLock))
{
IsUpdating = true;
MyProjectRepopulate.MyProjectRepopulate.RepopulateDatabase();
IsUpdating = false;
Monitor.Exit(myLock);
}
else
{
Common.RegisterStartupScript(con, LockJavaScript);
}
}
}
В мастере я делаю
protected void Page_Load(object sender, EventArgs e)
{
if (DataPopulation.IsUpdating)
lblRefresh.Visible = true;
else
lblRefresh.Visible = false;
}
]