- 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/
正如问题所说,C++ 程序员在转向 Java 时面临哪些常见/主要问题?我正在寻找一些广泛的主题名称或示例以及工程师必须进行的日常调整。然后我可以去深入阅读这个。 我对多年来使用 C++ 并不得不使用
我们正在准备发布一个在过去一年中一直在开发的大型网络应用程序。我们即将开始集成 ActiveMerchant 的过程,以处理该服务的经常性订阅费用。 我正在寻找关于考虑到我们的要求(如下所列)的最佳实
您陷入过哪些 Powershell 陷阱? :-) 我的是: # ----------------------------------- function foo() { @("text")
对于商业数据库而言,数据库升级是一个优先级很高的事情,有版本升级路线图,有相应的补丁,而且对于方案还有一系列的演练,显然是一场硬仗。而在MySQL方向上,升级这件事情就被淡化了许多,好像只能证明它的
Android 新增了 AsyncLayoutInflater类到他们的支持库版本 24.0 和更高版本,并且可以在 Android SDK 4.0 或更高版本(几乎所有可用的设备)中使用。 根据 A
作为一名刚接触 Vala 的程序员,您对刚接触该语言的人的第一条建议是什么? 最佳答案 这很大程度上取决于您的背景。如果您来自 C/C++/Java,最好的建议是学习函数式编程。 Vala 支持真正的
作为 Spring 世界的新手,我认为如果有一个社区 Wiki 页面列出基于 Spring 的项目中常见的陷阱会很好。 这些包括: 被误解的概念 在 Spring 3.X 中不再推荐的 Spring
我正在开发一个脚本来管理一些陷阱。一开始我只用这段代码管理 INT 和 SIGTSTP,它工作得很好: #!/bin/bash function capture_traps() { echo
bash 中是否可以在函数退出时调用某些命令。我的意思是: function foo { # something like this maybe? trap "echo \"exit
我们在我们的域中托管了一个应用程序。所有用户都需要先通过 POST 表单登录。登录后,表单会自动重定向到我们网站上的仪表板页面。 是否可以允许一些客户托管他们自己的登录表单(在他们的网站上),然后发布
我有一个无窗口计时器(没有 WM_TIMER),它只在给定的时间段过去后触发一次回调函数。它作为 SetTimer()/KillTimer() 实现。时间段足够小:100-300 毫秒。 对于每个如此
我使用 Java 大约一个月了,总体而言仍然是编程方面的业余爱好者,所以如果我有什么不对的地方,请随时纠正我。也许我会提供一些多余的细节,但我现在很困惑,无法决定什么才是重要的。 因此,我一直在开发多
我正在开发一个需要使用 FileSystemWatcher 类的 C# 程序,以便在创建新文件时通知它。作为初始化的一部分,程序会扫描目录,以便处理其中已存在的任何文件。一切正常。 但是,在与另一位开
下面材料整理自Internet&著作。 STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list
我正在使用 NuGet 包 Polly实现捕获故障转移 SQL 异常的重试逻辑。我在 Azure 中设置了 SQL Server Always On 高可用性。 我不想捕获所有 SQL 异常(这是不正
在编写 Scala RemoteActor 代码时,我注意到了一些陷阱: 必须设置 RemoteActor.classLoader = getClass().getClassLoader() 以避免“
出于某种原因,当我针对不存在的文件运行以下脚本时,我的脚本没有捕获异常。我基于我在网上找到的示例中的代码,但它似乎对我不起作用。 我将不胜感激有关如何解决此问题的任何提示或指示。 注意:在下面的例子中
我正在尝试从 R 调用 winBUGS 来估计逻辑回归。我正在使用以下代码: # Directorio de trabajo setwd("~/3 Diplomado/7 Bayesiana/8t1"
我正在尝试从 R 调用 winBUGS 来估计逻辑回归。我正在使用以下代码: # Directorio de trabajo setwd("~/3 Diplomado/7 Bayesiana/8t1"
我正在使用 ctypes 包装一个大型 C 库。 ctypesgen生成了包装代码(与我自己的做法相差不远)。作为包装 C 结构的 ctypes 的一部分,它们被制作为对象,其中一些在 C 中具有“s
我是一名优秀的程序员,十分优秀!