我有一个网站,当它启动时,它可能需要20秒,直到它准备好。启动是由访客完成的。但是,当网站启动时,另一位访问者可能会来。在这种情况下,我希望访问者等到我的方法(由第一个访问者调用)完成。然后他/她可以进入主页。
我该怎么做?让每个访问者都等到我的方法加载完毕?
编辑:从我的global.asax
调用可能需要一段时间的方法答案 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关键字重写。