2015-10-22 2 views
2

У меня есть веб-сайт, и когда он запускается, он может занять до 20 секунд, пока он не будет готов. Запуск запускается с курса посетителем. Но возможно, что другой посетитель приходит, когда сайт запускается. В этом случае я хочу, чтобы посетитель подождал, пока мой метод (который вызывается первым посетителем) завершен. Затем он может перейти на домашнюю страницу.Как разрешить посетителям дождаться завершения метода в MVC?

Как это сделать? Пусть каждый посетитель ждет, пока мой метод завершит загрузку?

EDIT: метод, который может занять некоторое время, вызываются из моего global.asax

+0

Как вы развертываете? – spender

+0

Я публикую свой сайт с помощью Visual Studio и скопирую файлы на сервер и перезапишу их. – Martijn

+0

Используйте Global.Asax, создайте два статических логических значения, установите первое значение boolean в true при входе первого посетителя, установите второе значение boolean в true при завершении запуска. Таким образом, когда пользователь вводит, метод Load должен проверять первое логическое значение, если он ошибочно запускает, если он проверяет второй, если он неверно перенаправляется на статическую страницу с «загрузкой сайта», повторите попытку через несколько секунд «Еще загрузите страницу – Gusman

ответ

2

Просто хранить простой логический флаг где-то: в статическом поле, базы данных, кэш и всякий раз, когда второй пользователь пытается получить доступ к сайту, вы проверяете, был ли установлен флаг, и если это так, вы делаете то, что хотите с этим пользователем. Даже этот грязный хак штраф:

while (ShouldWait()) 
{ 
    // Wait 5 seconds and check again 
    Thread.Sleep(5000); 
} 

Вот рабочий пример:

public class StartupFilterAttribute : ActionFilterAttribute 
{ 
    private static bool isReady = false; 
    private static bool isStartingUp = false; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (isReady) return; 

     if (!isStartingUp) 
     { 
      isStartingUp = true; 
      DoLongRunningOperation(); 
      isReady = true; 
      return; 
     } 

     while (!isReady) 
     { 
      Thread.Sleep(5000); 
     } 
    } 

    private void DoLongRunningOperation() 
    { 
     Thread.Sleep(20000); 
    } 
} 

И вы должны зарегистрировать его в глобальном масштабе:

protected void Application_Start() 
{ 
    GlobalFilters.Filters.Add(new StartupFilterAttribute()); 
} 

В идеале это должно быть переписанный с использованием ключевых слов async/await.

Смежные вопросы