我是否需要在Dispose()方法中调用垃圾收集器

时间:2016-03-30 01:44:03

标签: c# asp.net asp.net-mvc asp.net-mvc-5 dispose

我对write syntx有一个问题,要在我的asp.net mvc-5 web应用程序中实现Dispose。

现在我使用Visual Studio 2013创建了一个新的asp.net mvc-5 Web应用程序,并将我的数据库表映射到edmx文件中。然后我创建了一个新的Controller类。现在,Dispose()的默认代码如下所示: -

public class DeptsController : Controller
    {
  private ApplicationDbContext db = new ApplicationDbContext();

  //code goes here..

  protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

但与此同时,我发现许多在线文章和书籍使用以下语法来处理当前请求,如link所示: -

protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

所以我有这个问题: - 我应该/更喜欢使用哪种处理语法?这两种方法会产生相同的结果吗?

2 个答案:

答案 0 :(得分:1)

如果您的班级有~DeptsController方法(也称为终结方法或“析构函数”),而且只需拨打Dispose(),则需要拨打GC.SuppressFinalize(this)以阻止Dispose 1}}被叫两次。

如果你的班级没有析构函数,则没有必要。

答案 1 :(得分:0)

当您实现IDisposble时,只需使用visual studio将构建的实现。生成的代码中的注释可以准确地告诉您何时执行操作,而无需调用GC。生成代码的示例:

        private bool disposedValue = false; // To detect redundant calls

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                // TODO: dispose managed state (managed objects).
            }

            // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
            // TODO: set large fields to null.

            disposedValue = true;
        }
    }

    // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
    // ~ChampionGgCallerHttpClient() {
    //   // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
    //   Dispose(false);
    // }

    // This code added to correctly implement the disposable pattern.
    public void Dispose()
    {
        // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
        Dispose(true);
        // TODO: uncomment the following line if the finalizer is overridden above.
        // GC.SuppressFinalize(this);
    }