“获得处置关闭”是什么意思?

时间:2014-01-11 00:50:52

标签: 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正在给我警告:

  

获得处置关闭

在线:

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

session变量加下划线作为罪魁祸首)。

虽然ForEach方法采用lamba表达式来创建围绕变量session的闭包,但是我没有看到在执行此代码时可能会被处理的方法。也许reSharper认为ForEach可以并行执行某种任务,或者将Action<>保存一段时间,因此从技术上讲,它可能会在内存中仍然可以访问匿名函数时处理。

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

我习惯于reSharper比我更聪明,所以我想知道到底发生了什么。

1 个答案:

答案 0 :(得分:11)

因为session包含在using语句中,所以LINQ执行可以在枚举之前执行。

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

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