0

嗯,这真的很令人沮丧:我之前曾在 EF 中使用 IDisposable 的实体框架的参考中发布了这个问题, 现在该错误消失了,但我无法弄清楚这一点:

protected void Page_Init(object sender, EventArgs e)
    {
        try
        {
            String testCondition = Request.QueryString["Type"];
                switch (testCondition)
                {
                    case "A":
                        using (var rpt = new Report())
                        {
                         List<Class> lst= new ActionDBOClass.ActionMethod();    
                         // other code for crstal report view
                         //setting datasource of the same report
                        }
                        break;
                }
         }
    }

但随后我也收到警告说我必须在 ActionMethod 上实现 dispose(事实上我已经在同一个类中完成了 Idisposable 实现,例如:

 public class ActionDBOClass:IDisposable
{
    private bool _disposed = true;
    public void Dispose()
    {
        Dispose(_disposed);
        GC.SuppressFinalize(this);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                context.Dispose();
                // Dispose other managed resources.
            }
            //release unmanaged resources.
        }
        _disposed = true;
    }

我还需要做什么?我有类似的开关盒,这是我展示的第一个。

4

1 回答 1

0

如果您不在 Page_Init 方法之外使用 lst,请在返回之前调用 lst.Dispose()。就像是:

case "A":
    using (var rpt = new Report())
    {
    List<Class> lst= new ActionDBOClass.ActionMethod();    
    // other code for crstal report view
    //setting datasource of the same report
    lst.Dispose();
    }
    break;

更安全的方法是使用类似 using(List lst= new ActionDBOClass.ActionMethod()){... 因为这将确保在抛出异常时调用 Dispose,或者在 try 块之外声明 lst 并调用 Dispose如果 lst != null 在 finally 块中。

于 2013-03-02T14:39:20.370 回答