【问题标题】:Async=true and Entity FrameworkAsync=true 和实体框架
【发布时间】:2010-06-30 11:52:06
【问题描述】:
后台 WCF 堆栈,在实体框架中实现的数据访问,简单的 ASP.NET 前端
这是一个两部分的问题。
最近我们遇到了一个周期性崩溃的问题,异常如下:
从服务器接收结果时发生传输级错误。 (提供者:TCP Provider,错误:0 - 指定的网络名称不再可用
我们已经运行了一个多星期没有问题的应用程序,然后突然间我们遇到了这个随机崩溃/如果我不得不猜测我会说它与网络有关,但我们无法确定确切的来源。有没有人定期收到此消息?如果是这样,根本原因是什么?
第二个问题是有人建议在我们的实体框架连接字符串中设置“async=true”。我的印象是这只是启用了异步 api。当您使用 EF 时,这有什么作用吗?切换此标志是否对 EF 生成的查询有任何作用?
【问题讨论】:
标签:
wcf
sql-server-2005
entity-framework
.net-3.5
【解决方案1】:
要成为那个人,我会自己回答这个问题。
首先,我将关于“async=true”对实体框架的影响的问题发布到MS,但没有人像往常一样回答......(如果他们回答我会更新这篇文章)。
我们的问题:
从服务器接收结果时发生传输级错误。 (提供者:TCP Provider,错误:0 - 指定的网络名称不再可用
与环境有关。有些东西导致数据库运行得有点慢,但它暗示了一个更大的问题。显然,当您在线程之间共享上下文时,EF 存在可怕的问题(这不是一个容易解决的问题),因此我们看到了打开连接的竞争条件。
我们基本上有一个“只读上下文”,它只会获取。我们的问题是两个线程同时尝试打开连接,一个获胜,另一个失败,导致以下异常的一些变化:
连接没有关闭。连接的当前状态为正在连接。
我们的解决方案是将我们的单例转换为特定于线程的。不完全是我们想要的,但它起作用了,当我们推动这个修复时,我们的另一个问题神奇地消失了。
这个问题的后半部分是 async=true 的作用。说到EF,它让我们的系统崩溃了。我们有一个执行连接的代码块,如果 async=true 和 MARS=false 我们得到:
已经有一个打开的 DataReader 与此命令关联,必须先关闭
一旦我们减少了MARS,并且禁用了异步,事情又好了。