c# - Web 应用程序中的单例模式

标签 c# .net design-patterns singleton

我在我的网络应用程序中为数据上下文使用单例模式,这样我就不必每次都实例化它,但是我不确定网络应用程序是如何工作的,IIS 是否为每个连接的用户打开一个线程?如果是这样,如果我的单例不是线程安全的,会发生什么?另外,可以为数据上下文使用单例模式吗?谢谢。

最佳答案

I'm using a singleton pattern for the datacontext in my web application

在这种情况下,“单例”可能意味着许多不同的事情。它是每个请求的单个实例吗?每节课?每个线程?每个 AppDomain(static 实例)?所有这些的含义截然不同。

每个请求一个“单例”(存储在 HttpContext 中)就可以了。不鼓励每个 session 一个单例,但可以使它工作。每个线程的单例可能看起来有效,但可能会导致意外且难以调试的行为。每个应用程序或 AppDomain 的单例是一场等待发生的灾难。

so that I dont have to instantiate it every time

创建一个 DataContext 非常非常便宜。元数据是全局缓存的,在您实际执行查询之前不会创建连接。没有理由尝试优化 DataContext 实例的构造。

however I'm not sure how web applications work, does IIS open a thread for every user connected?

IIS对每个请求使用不同的线程,但是单个请求可能使用多个线程,而线程是从线程池中取出的,这意味着最终同一个用户会在多个不同的线程上有请求,反之,不同的用户将在多个请求和很长一段时间内共享同一个线程。这就是为什么我在上面提到你不能依赖线程本地单例。

if so, what would happend if my singleton is not thread safe?

非常糟糕的事情。您在 ASP.NET 应用程序中全局缓存的任何内容要么需要线程安全,要么需要在使用时锁定。

Also, is it OK to use a singleton pattern for the datacontext? Thanks.

DataContext 不是线程安全的,在这种情况下,即使您在 DataContext 正在使用时锁定它(这已经是一个糟糕的主意),您仍然会遇到跨线程/跨请求竞争条件。不要这样做。

DataContext 实例应尽可能限制在单个方法的范围内,使用 using 子句。下一个最好的办法是将它们存储在 HttpContext 中。如果必须的话,你可以在 Session 中存储一个,但是有很多事情你需要注意(参见 this question 我最近在 ObjectContext 上回答 - 几乎所有相同的原则都适用于一个 DataContext)。

但最重要的是,不要在 ASP.NET 应用程序中创建 DataContext 的“全局”单例实例。以后你会深深后悔的。

关于c# - Web 应用程序中的单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2398297/

相关文章:

c# - WCF 性能问题

c# - var 关键字在 LINQPad 4 中不起作用

c# - 如何正确管理 DataContext 的处置?

C#: "Cannot create an instance of the static class"

java - 初始化可能失败的惰性单例的哪种实现?

javascript - JavaScript "Factory Design Pattern"中的性能优化

c# - 邮政添加自定义 header

c# - 将触发器绑定(bind)到父集合中的元素

.net - Jetbrains 骑士 : Show "external code" in debugger call stack

c# - 我可以使用什么设计模式来完成以下任务