我有以下代码:
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比我更聪明,所以我想知道到底发生了什么。
答案 0 :(得分:11)
因为session
包含在using语句中,所以LINQ执行可以在枚举之前执行。
Resharper警告说这可能会导致异常,因为在枚举dbRecipes
时,session
可能已被处理掉。
我会说实话:我不确定上述代码是否会以警告的方式失败。