【问题标题】:When does context get disposed in various situations上下文何时在各种情况下得到处理
【发布时间】:2016-04-05 05:07:43
【问题描述】:

情况 1 和/或 2 会导致它等待 GC。我发现多次使用的上下文导致我们的代码中的方法只有一个 using 块,如果上下文足够快地处理,我想避免在这些情况下使用 using 块。一个例子是一个方法,它进行一些保存并打开上下文 -> 将数据保存到多个表 -> 然后返回 200 OK。

情况1

public function test()
{
    return new myContext().Events.FirstOrDefault();
}

情况2

public function test2()
{
    var ctx = new myContext();

    return ctx.Events.FirstOrDefault();
}

情况3

public function test3()
{
    Event e;
    using(var ctx = new myContext()) {
        e = ctx.Events.FirstOrDefault();
    }

    return e;
}

【问题讨论】:

标签: c# entity-framework


【解决方案1】:

任何实例都在等待 GC。如果使用 - 我们标记它已准备好收集(解决方案 3)。解决方案 1.2 将在退出范围后执行相同的操作。

【讨论】:

  • 我不认为这是正确的。使用实际上会处理我相信的对象。
  • 这是正确的。 using 将调用 IDisposable 实例中的 Dispose 方法。但它不保证 GC 会清理它。它将简单地标记它准备好被垃圾收集。但如果你仍然在某处引用它,它将不会被垃圾收集
  • 1,2 退出范围后如何做同样的事情。你有任何有用的链接吗?那么这 3 种方法实际上差别不大吗?
  • 正确的很少。在解决方案 1 中,CLR 将在退出对所有没有引用的所有局部变量的测试函数后调用 Dispose。在解决方案 3 中,我们通过“使用”稍早地做到了这一点。
  • “Dispose 不会自动调用,如果要释放资源,必须显式调用”stackoverflow.com/a/45049/3507404
【解决方案2】:

解决方案 1 和 2 不会处理上下文。释放上下文意味着将清理非托管资源。将上下文设置为 null 或离开范围不会触发此类清理。您应该使用using 构造或在显式调用context.Dispose 的地方添加一些代码(以try...finally 或任何其他首选方式(例如,您可能决定让您的自定义类实现IDisposable,并处置那里的上下文)

Entity Framework and context dispose

Uses of "using" in C#

Will the Garbage Collector call IDisposable.Dispose for me?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多