c# - "Access to disposed closure"是什么意思?

标签 c# closures resharper

我有以下代码:

public void DequeueRecipe(AuthIdentity identity, params Guid[] recipeIds)
{
   using (var session = GetSession())
   {
      var recipes = (from r in recipeIds select new Models.Recipes {RecipeId = r}).ToArray();

      var dbRecipes = session.QueryOver<Models.QueuedRecipes>()
         .Where(Expression.Eq("UserId", identity.UserId))
         .Where(Expression.InG("Recipe", recipes))
         .List<Models.QueuedRecipes>();

      using (ITransaction transaction = session.BeginTransaction())
      {
         dbRecipes.ForEach(r => session.Delete(r)); // <-- Warning
         transaction.Commit();
      }
   }
}

reSharper 给我警告:

Access to disposed closure

线上:

dbRecipes.ForEach(r => session.Delete(r));

(带下划线的 session 变量是罪魁祸首)。

虽然 ForEach 是真的方法接受一个 lamba 表达式,该表达式围绕变量 session 创建一个闭包。 ,我看不到执行此代码时可能会处理它的方法。也许 reSharper 认为 ForEach可能会并行执行某种任务,或者保存 Action<>稍后,因此从技术上讲,它可能会在内存中仍然可以访问匿名函数时被释放。

我可以安全地忽略这个警告吗?有没有办法重新格式化我的代码以防止出现此警告?此代码确实存在危险吗?

我已经习惯了比我聪明的 reSharper,所以我想了解到底发生了什么。

最佳答案

因为 session 被包裹在一个 using 语句中,LINQ 的执行可以被推迟到它被枚举为止。

Resharper 警告说这可能会导致异常,因为在枚举 dbRecipes 时,session 可能已经被释放。

老实说:我不确定上面的代码是否会以警告的方式失败。

关于c# - "Access to disposed closure"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21057117/

相关文章:

c# - 什么时候 Application_Deactivated **不**运行?

c# - RegularExpressionValidator 未触发空白条目

c# - 如何在 Windows Mobile 上解码 url 编码字符串?

ios - swift 中作为参数的闭包和函数之间的区别

c# - 对 AggregateException Handle 方法的混淆

c# - ReSharper 想要 "Optimize"我的代码

c# - 使用 ReSharper,如何在长时间运行的单元测试期间显示调试输出?

C# - 反序列化 SOAP 消息

python - python 闭包中的 cell_contents

javascript - 在javascript中将函数分配给变量时识别变量