【发布时间】:2011-06-22 13:29:55
【问题描述】:
如何跨多个线程处理 Linq-to_SQL DataContext?
我应该创建一个全局静态 DataContext 供所有线程使用并在最后提交更改,还是应该为每个线程创建一个 Context 并将该实例用于该线程内的所有内容?
【问题讨论】:
标签: c# multithreading linq-to-sql
如何跨多个线程处理 Linq-to_SQL DataContext?
我应该创建一个全局静态 DataContext 供所有线程使用并在最后提交更改,还是应该为每个线程创建一个 Context 并将该实例用于该线程内的所有内容?
【问题讨论】:
标签: c# multithreading linq-to-sql
DataContext 不是线程安全的;直接从多个线程使用它会导致#fail;拥有一个全局静态数据上下文会导致#fail 并且会导致不受控制的内存增长(数据上下文包括一个身份管理器和每个获取的对象的更改跟踪器;这只增长 随着时间的推移,随着更多的物体被触摸)
理想情况下,数据上下文应该用于一个工作单元;旋转一个;做 something (在范围内绑定 - 即不是整个应用程序生命周期),然后处置它。因此,IMO 的真正答案是“将其与该工作单元联系起来”。只有您可以知道您的应用程序中的内容;它可以是单一方法,可以是网页上的页面请求,也可以是服务中的计时器“滴答”。谁知道...
【讨论】:
DbConnection 对话,它涉及基于线程的状态(例如环境事务)。最重要的是:你有诸如事件之类的东西,它们将在任意线程上引发。在线程之间共享根本不是数据上下文所针对的场景,而且会以非常糟糕的方式结束。