ASP.NET开发人员真的需要关心线程安全吗?

时间:2009-08-27 15:28:38

标签: asp.net multithreading thread-safety

我认为自己了解线程的概念以及为什么某些代码是“线程安全的”,但是作为主要使用ASP.NET的人,线程和线程安全是我很少想到的。但是,我似乎在Stack Overflow上遇到了很多评论和答案(不一定是针对ASP.NET),因为“ 警告 - 这不是线程安全的! , “这往往让我猜测我是否编写了类似的代码,这些代码实际上可能会导致我的应用程序出现问题。 [震惊,恐怖等]所以我不得不问:

ASP.NET开发人员真的是否需要关注线程安全?

我的看法:虽然Web应用程序本质上是多线程的,但每个特定请求都在一个线程上,而您创建,修改或销毁的所有非静态类型都是独占的。单线程/请求。如果请求创建了一个DAL对象的实例,该对象创建了一个业务对象的实例并且I want to lazy-initialize a collection within this object,那么如果它不是线程安全的则无关紧要,因为它永远不会被触及通过另一个线程。 ...对? (假设我没有在请求期间启动一个新线程来启动长时间运行的异步进程。我很清楚这会改变一切。)

当然,静态类,方法和变量恰恰相反。它们由每个请求共享,并且开发人员必须非常小心,不要有“不安全”的代码,这些代码在由一个用户执行时会对所有其他用户产生意想不到的影响。

但这就是它,因此ASP.NET中的线程安全性大部分归结为:小心你如何设计和使用静态。除此之外,你根本不需要担心它。

我对此有何不妥?你不同意吗?启发我!

4 个答案:

答案 0 :(得分:8)

除了对应用程序的所有请求共享的静态项之外,还有某些对象。例如,小心将项目放在应用程序缓存中是非线程安全的。此外,在处理请求时,没有什么可以阻止您生成自己的线程进行后台处理。

答案 1 :(得分:4)

ASP.NET开发人员有不同级别。你可以在不知道任何线程,互斥锁,锁定,信号量甚至设计模式的情况下,成为一名完美的ASP.NET开发人员,因为很大比例的ASP.NET应用程序基本上都是CRUD应用程序,几乎没有额外的业务逻辑。

然而,我遇到的大多数优秀的ASP.NET开发人员不仅仅是ASP.NET开发人员,他们的技能涵盖了所有关于线程和其他好东西的知识,因为他们并不局限于ASP。净。

所以不,在大多数情况下,ASP.NET开发人员不需要了解线程安全性。但是,只知道最低限度才有趣吗?

答案 2 :(得分:3)

我相信你一切都很好。我同意你的看法。专注于ASP.NET只是很少(如果有的话)涉及多线程问题。

然而,在优化方面,情况会发生变化。每当您启动一个持久的查询时,您可能经常希望让它在一个单独的线程中运行,以便在服务器报告连接超时之前页面加载不会停止。您可能希望此页面定期检查完成状态以通知用户。这就是多线程问题。

答案 3 :(得分:3)

只有在单个HTTPRequest的处理流中创建自己的多个线程...例如,如果网页将显示一组股票的股票报价,并且您单独调用股票在生成要发送回客户端的页面之前,在独立线程上引用服务来检索引号...然后你必须确保在你的线程中运行的代码是线程-安全。