在ASP.net中,最好尽快关闭datacontext吗?

时间:2012-09-20 16:11:10

标签: c# asp.net database performance datacontext

鉴于此代码:

/// <summary>
/// Add to view count of this article
/// </summary>
public static void IncrementViewCount(int articleID)
{
    using (var db = new MainContext())
    {
        var q = (from c in db.tblArticles where c.ID == articleID select c).SingleOrDefault();
        if (q != null)
        {
            q.Views ++;
            db.SubmitChanges();

            if (q.Views == 500)
            {
                // Call function
            }
        }
    }
}

以下列方式编写它是否更好:

/// <summary>
/// Add to view count of this article
/// </summary>
public static void IncrementViewCount(int articleID)
{
    var newViews = 0;
    using (var db = new MainContext())
    {
        var q = (from c in db.tblArticles where c.ID == articleID select c).SingleOrDefault();
        if (q != null)
        {
            newViews = q.Views + 1;
            q.Views = newViews;
            db.SubmitChanges();
        }
    }
    if (newViews == 500)
    {
        // Call function
    }
}

注意在示例#2中,using块在较早的时候关闭。

1 个答案:

答案 0 :(得分:1)

根据你的“功能”需要多长时间而你不需要上下文,第二个更好。

阅读本文

  

我们实施IDisposable有几个原因:

     

如果应用程序逻辑需要保留超出预期使用DataContext或有效的实体,则可以通过调用Dispose来强制执行该合同。该实体中的延迟加载器仍将引用DataContext,并且如果任何代码尝试导航延迟属性,则会尝试使用它。这些尝试将失败。 Dispose还强制DataContext转储其物化实体的缓存,以便单个缓存实体不会意外地保持通过该DataContext实现的所有实体,否则会导致内存泄漏。

     

可以欺骗自动关闭DataContext连接的逻辑,使连接保持打开状态。 DataContext依赖于枚举查询的所有结果的应用程序代码,因为到结果集的末尾会触发连接关闭。如果应用程序使用IEnumerable的MoveNext方法而不是C#或VB中的foreach语句,则可以提前退出枚举。如果您的应用程序遇到连接未关闭的问题,并且您怀疑自动关闭行为不起作用,则可以使用Dispose模式作为解决方法.u不需要它们。

更多信息