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

我有以下代码
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));

(会话变量加下划线作为罪魁祸首).

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

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

我习惯于reSharper比我更聪明,所以我想知道究竟发生了什么.

解决方法

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

Resharper警告这可能会导致异常,因为在枚举dbRecipes时,会话可能已被释放.

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...