c# – 在Application_Start上启动长时间运行的线程时可能存在的缺陷
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在Application_Start上启动长时间运行的线程时可能存在的缺陷,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2397字,纯文字阅读大概需要4分钟。
内容图文
![c# – 在Application_Start上启动长时间运行的线程时可能存在的缺陷](/upload/InfoBanner/zyjiaocheng/785/659e04ff00cb4d1b9e034d1ddc5526e3.jpg)
我希望将这篇文章塑造成一个合法的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版本之间发生变化,因为它们可能使用不同的线程模型吗?我正在寻找有关此设计的整体反馈.
解决方法:
tl;博士:你正在做的事情可能很好,并且是处理这种情况的常用方法.
肯定有线程的问题.并不是说你不应该在这种情况下使用它们,但你明智地确保你理解它们.滥用旧的模因:“程序员经常会看到并发问题,并通过使用另一个线程解决它.现在他们有两个问题.”
如果您的线程是一个后台线程(意味着它不应该阻止您的站点在线程仍在运行时关闭),请确保设置了IsBackground属性.更好的是,使用BackgroundWorker.
在初始化线程完成之前,您的站点有多可用?是否有任何真正的理由在初始化时显示界面?
我已经全力以赴地直接使用线程来实现并发 – 从害怕它们到思考我理解它们并拥抱它们,认为我理解它们并且害怕它们.现在,当我有一个我想要解决的并发/异步问题时,我通常会尝试创建一个由多个,相互通信,并发(但是单线程)进程组成的体系结构.很多事情都变得那么简单,我已经取得了很大的成功.
在您当前的情况下,如果您可以确保在准备好之前不能访问线程正在准备的资源,那么使用后台线程来处理数据库负载可能是足够安全的.但是,(如果你可以定位.Net 4.0),一个更好的方法来做你想要的就是利用Task Async库 – 也就是说,编写你的例程是异步的,并返回一个T的任务而不是T本身.如果操作正确,这可以让您的站点响应用户,即使在单线程环境中,甚至在后台仍在加载资源时也是如此.
内容总结
以上是互联网集市为您收集整理的c# – 在Application_Start上启动长时间运行的线程时可能存在的缺陷全部内容,希望文章能够帮你解决c# – 在Application_Start上启动长时间运行的线程时可能存在的缺陷所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。