如何让访问者等到MVC中的方法完成?

时间:2015-10-22 11:18:24

标签: c# asp.net-mvc

我有一个网站,当它启动时,它可能需要20秒,直到它准备好。启动是由访客完成的。但是,当网站启动时,另一位访问者可能会来。在这种情况下,我希望访问者等到我的方法(由第一个访问者调用)完成。然后他/她可以进入主页。

我该怎么做?让每个访问者都等到我的方法加载完毕?

编辑:从我的global.asax

调用可能需要一段时间的方法

1 个答案:

答案 0 :(得分: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关键字重写。