TimeoutException没有被抛出Linq到SQL DataContext.CommandTimeout C#

时间:2013-11-04 20:29:07

标签: c# .net sql-server-2008 linq-to-sql

我正在尝试在Linq to SQL中执行存储过程调用所需的时间超过4分钟时抛出TimeoutException。

以下是我的控制器中的代码:

public IEnumerable<Quality> Get(DateTime param1, DateTime param2, string param3)
        {     

            var dc = new VideoDataContext(WebApplication.MonitorServer);

            dc.CommandTimeout = 240;

            List<Quality> cqs = dc.Vid_GetQualityForVideo(param1, param2, 
            param3).ToList();


            return cqs;
        }

由于某种原因,代码执行时间超过(时间更长)超过4分钟,但不会引发超时异常。最后,我得到一个内存异常,用于真正的大查询。

我无法优化查询甚至看不到它,因为我无法访问存储过程。我只能在应用程序中检测到超时。有谁知道为什么我没有得到TimeoutException。

在我的代码中的其他地方,我有非常相似的代码,并且在另一台持有不同数据库的服务器上4分钟后抛出超时。这不会发生在这里。

我可以写信给Data团队改变他们的内容,但我想具体说明问题所在。

谢谢!

编辑:为了澄清我在检索数据之前所看到的,它将永远需要,并注意到传递给客户端的大量数据。我有一个MVC Action Filter来检测行数,如果它超过某个阈值(现在为10000),它只会将错误消息传递给客户端而不是整个数据集。我正在运行的查询返回的方式超过了阈值,但仍需要超过4分钟才能完成。

2 个答案:

答案 0 :(得分:1)

如果您的查询很大,.ToList()可能会导致性能问题。您从查询中获得的IEnumerable<T> lazily 评估的。但是,调用.ToList()会遍历结果的全部内容,并将其放入生成的Listcqs)中。

如果您真的希望将函数返回IEnumerable<Quality>,那么您可以只返回查询IEnumerable

public IEnumerable<Quality> Get(DateTime param1, DateTime param2, string param3)
    {     

        var dc = new VideoDataContext(WebApplication.MonitorServer);

        dc.CommandTimeout = 240;

        return dc.Vid_GetQualityForVideo(param1, param2, param3);
    }

编辑:

为了澄清一下,如果你得到一个内存流,而不是超时流,我怀疑将IEnumerable评估为cqs就像IEnumerable迭代一样快地填充内存。我会使用LINQ查询(Filter等)来截断结果IEnumerable

另外(在评论中提醒),我会把我的钱放在你没有得到超时的原因是因为dc.Vid_GetQualityForVideo(param1, param2, param3)成功评估。以下ToList()调用它返回导致溢出。对它进行一些基本的断点检查就可以证实这一点。

答案 1 :(得分:0)

可能请求运行良好,您的大数据通过网络接收。在这种情况下,不应发生TimeOut异常。