【问题标题】:ASP.NET Thread Safety in aspx.cs code behind file文件后面的 aspx.cs 代码中的 ASP.NET 线程安全
【发布时间】:2011-01-31 09:18:45
【问题描述】:

我正在考虑将 DataContext 作为成员变量添加到我的 aspx.cs 代码隐藏类中以执行 LinqToSql 查询。

这个线程安全吗?我不确定是否为每个 HTTP 请求创建了这个代码隐藏类的新实例,或者该实例是否在所有请求线程之间共享?

我担心我会同时收到 10 个使用同一数据库会话的并发 http 请求。

公共部分类 MyPage : System.Web.UI.Page { 私有数据上下文 myDB = new DataContext(); protected void MyAction_Click(object sender, EventArgs e) { myDB.DoWork(); } }

【问题讨论】:

  • 记住您的 MyPage 类在每次请求时都会被实例化,并且 MyPage 的每个新实例都有自己的私有 DataContext 变量的副本。

标签: asp.net datacontext code-behind


【解决方案1】:

这是安全的,因为每次加载您的页面时都会创建一个 MyPage 的新实例,因此也会创建一个 DataContext 的新实例。

无需担心线程安全问题。

【讨论】:

    【解决方案2】:

    MSDN 上的 DataContext 对象线程安全解释如下:

    此类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。

    由于您使用私人会员,您必须考虑在课堂上的使用。只要您不启动后台线程并与您共享实例就不必担心。

    应将 DataContext 视为资源,您可能需要考虑将其作为类生命周期的一部分显式处理。它是一个足够轻量级的对象,可以考虑为每个操作添加一个 using 块,具体取决于您的使用情况。请参阅MSDN description

    DataContext 实例旨在持续一个“工作单元”,但是您的应用程序定义了该术语。 DataContext 是轻量级的,创建起来并不昂贵。典型的 LINQ to SQL 应用程序会在方法范围内创建 DataContext 实例,或者将其作为代表一组相关数据库操作的逻辑集合的短期类的成员。

    【讨论】:

    • 优秀的答案!我看过您对其他问题的回答,并认为您是天生聪明的怪胎。感谢您花时间回答我的问题。
    • 哇!谢谢,背书支票已在邮件中。
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多