我希望将这篇文章塑造成一个合法的 StackOverflow 问题,因为我真的很想深入了解这种情况,但我肯定可以看看它是否过于本地化或被视为“意见”。
这是我的场景:当我加载我的 Web 应用程序时,我从数据库中加载了一大堆数据并将其缓存。问题是,这个过程大约需要 10-15 秒,并且会在 Web 服务器首次启动时产生延迟。这在开发时有点烦人,并且当我在生产中反弹 Web 服务器时也会导致一些问题(因为这是一个新站点,我经常在发现小错误时对其进行热修复,或者对 IIS 设置进行修改)。
我想知道 - 我可以在应用程序启动时将这项工作卸载到一个新线程中,并在其他用户使用该站点时在后台进行吗?显然,当网站加载时,某些功能在大约 10-15 秒内无法工作,但我可以处理这种情况或阻止,直到数据可用。起初,我想不会。如果请求结束,Web 服务器要么终止这些线程,要么阻塞直到这些线程完成。我决定编写一个小测试应用程序来测试这个理论:
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
Thread thread = new Thread(LoadData);
thread.Start();
}
private void LoadData()
{
for (int i = 0; i < 100; i++)
{
Trace.WriteLine("Counter: " + i.ToString());
Thread.Sleep(1000);
}
}
}
当应用程序启动时,我启动了一个新线程,并将其计数为 100。令我惊讶的是,我立即进入主页,在我的 Visual Studio 调试输出窗口中,我可以看到递增的数字计数。我真的很惊讶这个作品。
我的问题:
首先,这样做有什么问题吗?它是在自找麻烦吗?有什么事情会爆炸吗?这种行为是否会在 Web 服务器或 IIS 版本之间发生变化,因为它们可能使用不同的线程模型?我正在寻找有关此设计的总体反馈。