Async = true和Entity Framework

Nix*_*Nix 4 wcf entity-framework sql-server-2005 .net-3.5

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

这是一个两部分问题.

最近我们遇到了一个周期性崩溃的问题,例外情况如下:

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

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

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

Nix*_*Nix 6

作为那个人,我将自己回答这个问题.

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

我们的问题:

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

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

我们基本上只有一个"只读上下文"才能获得.我们的问题是两个线程试图同时打开连接,一个获胜,另一个失败导致下面的异常的一些变化:

连接没有关闭.连接的当前状态是连接.

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

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

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

一旦我们削减了MARS,并且禁用异步事情再次成功.