이벤트 대의원이 제거되도록 정적 분석 규칙 (FXCOP)을 작성하는 방법에 대한 아이디어

StackOverflow https://stackoverflow.com/questions/854716

문제

우리는 큰 메모리 누출 분석을 겪어 왔으며 기여 요인 중 하나가 이벤트에서 대의원을 제거하지 못하는 것으로 나타났습니다.

대의원이 핸들러에서 제거되도록 FXCOP에 규칙을 작성하는 방법에 대한 아이디어가 있습니까?

방금 봤어요 이것 따라서 더 많은 정보를 요청하겠습니다.

도움이 되었습니까?

해결책

좋아, 실제 수표를 구현하는 문제 외에 (내 의견으로는 이것은 매우 유사하다. 경로 범위 따라서 실용적이지 않음) - 새로운 FXCOP 규칙을 작성하는 방법이 있습니다.

처음에는 한 번 도움이 된 몇 가지 기사 :

간단한 규칙을 구현하는 것은 큰 문제가 아닙니다. 프로젝트에는 임베디드 리소스로서 규칙이 필요합니다. 여기). 당신은 당신의 수업을 이끌어냅니다 BaseIntrospectionRule check ()-메소드에 코드를 추가하십시오.

public override ProblemCollection Check( TypeNode typeNode )
{
  if( type.IsPublic )
  {
    Problems.Add( new Problem( ... ) );
  }
  return Problems;
}

나는 얼마 전에 이것을했다. 나는 그것이 설명 된대로 여전히 작동하기를 바랍니다 :)

다른 팁

더 구체적이어야합니다. 가입자가 출판사보다 짧은 삶을 살기 때문에 모든 이벤트 대의원이 구독 취소되었는지 확인할 필요는 없습니다. 그리고 메모리 누출은 가입자가 게시자보다 오래 지속되는 것처럼 보일 때만 발생하므로 GC가 게시자 객체를 수집하지 못하게하는 참조가 있습니다.

이제 우리는 비교적 짧은 생명 객체에서 이벤트를 구독하면 결국 구독을 취소하는지 확인해야합니다.

이 경우에 나올 수있는 휴리스틱 : 모든 로컬 변수 객체 (현재 코드 블록 {}에 의해 범위 됨)와 명시 적으로 폐기하는 모든 객체를 분석합니다. 이 객체의 모든 이벤트에 대해 구독 횟수와 구독 취소 횟수를 계산합니다. 첫 번째 숫자가 더 크면 경고를 방출합니다.

물론 모든 경우를 다루는 것은 아니지만이 문제의 모든 사례를 다룰 수는 없다고 생각합니다. 충분한 방법이 필요합니다.

여기서는 동적 분석 및 코드 리뷰의 장점을 언급하지 않을 것입니다. 여기서는 질문과 관련이없는 별도의 주제이기 때문입니다.

모든 이벤트 구독이 약한 차량을 통해 처리되어야한다는 규칙을 강요 할 수 있습니까? 프로그램의 실제 흐름을 분석하는 것보다 이것이 구현하기가 더 쉬울 것이라고 생각합니다.

핸들러를 구현하는 객체가 어떻게 든 이벤트와 함께 객체에 대한 참조를 가지고 있다고 가정하는 것이 안전합니까? 이 경우 다른 방법으로 사이클을 깨는 방법을 알아내는 것이 좋습니다.

우리는 ASP.NET 페이지의 이벤트 핸들러와 비슷한 일을했습니다. 핸들러를 구현 한 객체에도 페이지에 대한 참조가있었습니다. 가능한 한 많은 링크를 건축 적으로 깨뜨린 후, 몇 가지 좌회전이 약한 수반으로 변경되었습니다. 더 이상 메모리 문제가 없습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top