【问题标题】:Linq-to-SQL DataContext across multiple threads跨多个线程的 Linq-to-SQL DataContext
【发布时间】:2011-06-22 13:29:55
【问题描述】:

如何跨多个线程处理 Linq-to_SQL DataContext?

我应该创建一个全局静态 DataContext 供所有线程使用并在最后提交更改,还是应该为每个线程创建一个 Context 并将该实例用于该线程内的所有内容?

【问题讨论】:

    标签: c# multithreading linq-to-sql


    【解决方案1】:

    DataContext 不是线程安全的;直接从多个线程使用它会导致#fail;拥有一个全局静态数据上下文会导致#fail 并且会导致不受控制的内存增长(数据上下文包括一个身份管理器和每个获取的对象的更改跟踪器;这只增长 随着时间的推移,随着更多的物体被触摸)

    理想情况下,数据上下文应该用于一个工作单元;旋转一个;做 something (在范围内绑定 - 即不是整个应用程序生命周期),然后处置它。因此,IMO 的真正答案是“将其与该工作单元联系起来”。只有您可以知道您的应用程序中的内容;它可以是单一方法,可以是网页上的页面请求,也可以是服务中的计时器“滴答”。谁知道...

    【讨论】:

    • @Rancur3p1c "why":因为集合很少是线程安全的,并且同一上下文同时在同一个连接上多次交谈将是一场噩梦。通常的免责声明是:“这种类型的任何公共静态(Visual Basic 中的共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。”见msdn.microsoft.com/en-us/library/…
    • @Marc Gravell:非线程安全与从不同线程访问时失败不同。只要有适当的锁定机制,就可以以安全的方式从不同的线程访问全局变量。相比之下,非 UI 线程对 UI 元素的访问是真正被禁止的,并且会导致运行时异常。在这种情况下,需要从后台线程调用 UI 线程。您的#fail 声明基于哪些文档?因为你让它听起来像 UI 线程案例...
    • @Christoph 任何可能导致模型突变的东西都将变得难以控制;由于数据上下文具有多个级别的延迟加载,因此即使只是读取它也会发生突变 - 基本上,您甚至需要一个全局锁来读取模型。它与DbConnection 对话,它涉及基于线程的状态(例如环境事务)。最重要的是:你有诸如事件之类的东西,它们将在任意线程上引发。在线程之间共享根本不是数据上下文所针对的场景,而且会以非常糟糕的方式结束。
    猜你喜欢
    • 2010-09-19
    • 2010-09-18
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多