다음 코드가 있습니다.
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
메서드는 변수 주위에 클로저를 만드는 람바 식을 사용 하는 것이 사실이지만 session
이 코드가 실행될 때 처리 될 수있는 방법을 보지 못했습니다. 아마도 reSharper ForEach
는 일종의 작업을 병렬로 실행하거나 Action<>
나중에 저장할 수 있다고 생각할 수 있습니다 . 따라서 기술적으로는 익명 함수가 메모리에 계속 도달 할 수있는 동안 처리 될 수 있습니다.
이 경고를 무시해도 안전합니까? 이 경고가 나타나지 않도록 코드를 다시 포맷 할 수있는 방법이 있습니까? 이 코드가 제시하는 위험이 실제로 있습니까?
저는 reSharper가 저보다 똑똑한 데 익숙해 져서 무슨 일이 일어나고 있는지 정확히 이해하고 싶습니다.
session
using 문에 래핑되어 있기 때문에 열거 될 때까지 LINQ 실행이 지연 될 수 있습니다.
Resharper는 이로 인해 예외가 발생할 수 있다고 경고합니다. 시간 dbRecipes
이 열거 session
될 때까지는 폐기되었을 수 있기 때문 입니다.
솔직히 말씀 드리면 위의 코드가 경고 한대로 실패 할 수 있을지 모르겠습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다