- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望将这篇文章塑造成一个合法的 StackOverflow 问题,因为我真的很想深入了解这种情况,但我绝对可以看看它是否过于本地化或被视为“意见”。
这是我的场景:当我加载我的网络应用程序时,我从数据库中加载了一大堆数据并将其缓存。问题是,这个过程大约需要 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 版本之间发生变化,因为它们可能使用不同的线程模型?我正在寻找对此设计的总体反馈。
最佳答案
tl;dr:您所做的可能没问题,并且是处理这种情况的常用方法。
线程肯定有问题。并不是说在这种情况下你不应该使用它们,但是确保你理解它们是明智的。滥用一个古老的模因:“程序员经常会看到并发问题,并通过使用另一个线程来解决它。现在他们有两个问题。”
如果您的线程是后台线程(这意味着如果线程仍在运行,它不应阻止您的站点关闭),请确保设置了 IsBackground 属性。更好的是,使用 BackgroundWorker .
在初始化线程完成之前,您的网站的可用性如何?是否有任何真正的理由在初始化时显示界面?
我在直接使用线程进行并发方面走了一个完整的圈子——从害怕它们,到认为我理解它们并拥抱它们,再到认为我理解它们并害怕它们。现在,当我遇到要解决的并发/异步问题时,我通常会尝试创建一个由多个相互通信的并发(但单线程)进程组成的架构。很多事情都以这种方式变得更简单,而且我已经取得了很大的成功。
在您当前的情况下,如果您可以确保在线程准备好资源之前不访问该线程正在准备的资源,那么使用后台线程处理数据库负载可能就足够安全了。但是,(如果您可以针对 .Net 4.0),更好的方法是利用 Task Async library - 也就是说,将您的例程编写为异步的,并返回 T 的 Task 而不是 T 本身。如果处理得当,这可以让您的网站响应用户,即使在单线程环境中,甚至在它仍在后台加载资源时也是如此。
关于c# - 在 Application_Start 上启动长时间运行的线程时的潜在陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12923616/
我研究了很多但一无所获...... Application_Start 事件在发布站点时未触发。但是它在本地主机上运行良好。发布后,我在 Bin 文件夹中获得了 App_global.asax.dll
我在 global.asax 文件的 application_start() 方法中编写了一些代码。当我在 IIS 服务器上部署我的应用程序时,它不会被调用。当我在 .NET 框架中运行代码时,它是可
我们目前使用这行代码来获取 Application_Start 事件中的当前应用程序 url。 string sApplicationURL = HttpContext.Current.Request
我有一个正在开发的 ASP.NET MVC(测试版)应用程序,但我无法确定是我做错了什么,还是我的 Application_Start 方法在 Global.当我尝试调试应用程序时,asax.cs 实
我有一个在 asp.net MVC 2 上制作的应用程序,它位于我电脑上的 IIS 7.5 上,我尝试对其进行分析,发现 Application_Start 被调用多次, 有人知道为什么会发生这种情况
我正在使用 sitecore 7.5,我需要在 application_start 中添加新路由以便在 ajax 调用中使用它,但是当我运行应用程序时,sitecore 似乎将路由作为内容项处理,请提
我必须处理用 .NET Framework 1.1 编写的遗留 ASP.NET 应用程序。在检查应用程序代码时,我发现了有趣的部分。应用程序在 Application_Start 事件处理程序 (Gl
是否可以在 Application_Start 上创建一个可以在所有 Controller 中使用的类实例? 我希望能够创建例如: var globalHelper = new LoadsStuff(
我希望将这篇文章塑造成一个合法的 StackOverflow 问题,因为我真的很想深入了解这种情况,但我绝对可以看看它是否过于本地化或被视为“意见”。 这是我的场景:当我加载我的网络应用程序时,我从数
我一直在尝试在全局 asax 的 Application_Start 事件上获取我的项目的应用程序路径我可以在未路由的页面上使用 server.mappath 但是当我在路由页面上时我得到新的虚拟pa
我正在使用 IIS7.5 强制我的 Web 应用程序自动加载 (startMode="AlwaysRunning"),现在我想预加载我的缓存数据。不过我有点困惑,因为两种方法看起来是一样的: 在 gl
我无法使用 获取 Application_Start 中的当前物理路径 HttpContext.Current.Request.PhysicalApplicationPath 因为当时没有Reques
我不明白为什么在我的 ASP.NET 应用程序启动时 Application_Start 事件会被调用两三次? Application_End 不在 Application_Start 调用之间调用。
在我们的 Application_Start事件处理程序我们正在执行一些由于文件锁定问题而间歇性失败的操作。在这种情况下,我们希望将应用程序返回到“未启动”状态。 我的意思是,用户将看到一个错误页面,
问题: Application_Start 事件没有在我的包含 TCP 端点的 WCF 服务中触发。 背景: 我正在尝试从控制台应用程序访问该服务。如果服务尚未启动,则调用将失败,因为 Applica
我正在调试一个初始页面加载缓慢的 ASP.NET 2.0 应用程序。 通过添加日志记录,我发现 Application_Start事件在启动时触发两次,两个事件之间有很短的延迟。 Session_St
... Application_Start 方法是否会为下一个请求再次运行? 它是否取决于 ASP.NET 版本、托管服务器版本和/或其他上下文? 我试图确定在那里加载关键程序集是否是一件好事。例如,
我目前正在更改我们的数据库部署策略以使用 FluentMigration,并一直在阅读如何运行它。有些人建议它可以从 Application_Start 运行,我喜欢这个想法,但其他人说不,但没有具体
我有一个应用程序在我的开发工作站上运行良好,但在将应用程序部署到实时环境时失败。看来 Application_Start 没有在实时环境中被调用。 最佳答案 我可以通过删除测试服务器上网站根目录中的
我有一个 ASP.NET Web 应用程序开始显示一些非常奇怪的行为。下面是一些示例代码: // in Bar.cs public class Bar { public static Baz
我是一名优秀的程序员,十分优秀!