我在不同的线程中每隔十秒运行一次Windows服务。
此服务将SQL Server 2008数据库上的各种CRUD操作放在同一台计算机上。
对于每个CRUD操作,我都放了一个“使用”括号,如下例所示:
public object InsertClient(clsClient c)
{
using (ClientEntities e = new ClientEntities()) {
e.Clients.AddObject(c);
}
}
如果已经有另一个线程与同一个表进行交互,那么我担心这个操作的效率。这是正确的方法吗?
此外,使用此方法是否存在线程异常的风险?
感谢您的帮助。
答案 0 :(得分:2)
不,只要您立即创建和处理多个对象实体,就没有错。
以下是MSDN的一般建议。
使用长时间运行的对象上下文时,请考虑以下事项:
当您将更多对象及其引用加载到内存中时,对象上下文可能会在内存消耗中快速增长。这可能会导致 表现问题。
请记住在不再需要时处理上下文。
- 如果异常导致对象上下文处于不可恢复状态,整个应用程序可能会终止。
- 随着查询和更新数据的时间之间的差距越来越大,遇到与并发相关的问题的可能性也会增加。
- 使用Web应用程序时,请为每个请求使用对象上下文实例。如果要跟踪对象之间的更改 层,使用自我跟踪实体。有关更多信息,请参阅 使用自我跟踪实体和构建N层应用程序。
- 使用Windows Presentation Foundation(WPF)或Windows窗体时,请为每个窗体使用一个对象上下文实例。这可以让你使用 更改对象上下文提供的跟踪功能。
如果您担心每个新对象实体创建连接的成本,由于EF依赖于数据提供程序,并且提供程序是ADO.Net,默认情况下启用connection pooling,除非您在连接字符串。
此外,元数据是每个应用程序域全局缓存,因此每个新对象实体都只是从全局缓存中复制元数据。
由于EF不是线程安全的,因此建议在每个线程中使用每个对象实体。
与.NET一样,实体框架不是线程安全的。这意味着 您可以在多线程环境中使用实体框架 需要将各个ObjectContexts明确地保持在一起 线程,或者非常认真地锁定线程以便你 不要碰撞。 - MSDN