Async = true和Entity Framework

时间:2010-06-30 11:52:07

标签: wcf sql-server-2005 entity-framework .net-3.5

后台WCF堆栈,在实体框架中实现的数据访问,简单的ASP.NET前端

这是一个两部分问题。

最近我们遇到了一个定期崩溃的问题,例外情况是:

  

从服务器接收结果时发生传输级错误。 (提供者:TCP提供者,错误:0 - 指定的网络名称不再可用

我们已经运行我们的应用程序没有问题超过一个星期,然后突然我们被这个随机崩溃击中/如果我不得不猜我会说它是网络相关的,但我们无法确定确切的资源。有没有人定期收到这条消息?如果是这样,根本原因是什么?

第二个问题是有人建议在我们的Entity Framework连接字符串中设置“async = true”。我的印象是这只是启用异步api。使用EF时,这有什么用处吗?切换此标志是否对EF生成的查询执行任何操作?

1 个答案:

答案 0 :(得分:6)

要成为那个人我会自己回答这个问题。

首先,我向MS发布了关于“async = true”对实体框架的影响的问题,没有人像往常一样回答(如果他们回答我会更新这篇文章)。

我们的问题:

  

从服务器接收结果时发生传输级错误。 (提供者:TCP提供者,错误:0 - 指定的网络名称不再可用

与环境有关。有些事情导致数据库运行速度稍慢,但它暗示了一个更大的问题。显然,当您在线程之间共享上下文时,EF会出现可怕的问题(这不是一个容易解决的问题),所以我们看到了一个开放连接的竞争条件。

我们基本上只有一个“只读上下文”。我们的问题是两个线程试图同时打开连接,一个赢,另一个输了导致下面的异常的一些变化:

  

连接未关闭。连接的当前状态是连接。

我们的解决方案是将我们的单例转换为线程特定的。不完全是我们想要的,但它有效,当我们推动这个修复时,我们的另一个问题神奇地消失了。

这个问题的后半部分是async = true做了什么。说到EF,它让我们的系统崩溃了。我们有一个代码块进行了连接,如果async = true且MARS = false,我们得到了:

  

已经有一个与此命令关联的打开DataReader,必须先关闭

一旦我们削减了MARS,禁用的异步事情再次成功。