2009-11-10 4 views
4

내 WPF 응용 프로그램에서 약 4kb/s의 메모리 누수가 발생합니다. 작업 관리자의 메모리 사용량은 응용 프로그램이 "메모리 부족"예외로 인해 충돌 할 때까지 계속 올라갑니다. 내 자신의 연구를 수행함으로써XP에서의 WPF 메모리 누수 (CMilChannel, HWND)

나는 문제가 여기에서 논의되는 것으로 나타났습니다 : Track down memory leak in WPF 여기 # 8 : http://blogs.msdn.com/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx

설명하는 문제는이 프레임 워크의 버전에서 WPF 존재의 누출입니다을 최대 .NET 3.5 SP1을 포함합니다. 이 문제는 WPF가 렌더링 스레드에서 UI 스레드로 메시지를 보내는 데 사용할 HWND를 선택하는 방식 때문에 발생합니다. 이 샘플은 생성 된 첫 번째 HWND를 삭제하고 새 창에서 애니메이션을 시작합니다. 이로 인해 렌더 스레드에서 보낸 메시지가 처리되지 않고 쌓여 효과적으로 메모리가 누수됩니다. 제공

솔루션은 다음과 같습니다 해결 방법은 앱 클래스 생성자에 새로운하여 HwndSource 첫번째 일을 만드는 것입니다. 이것은 다른 HWND가 WPF에 의해 생성되기 전에 만들어 져야합니다 (MUST). 간단히이 HwndSource를 생성함으로써, WPF는 렌더 스레드에서 UI 스레드로 메시지를 전송할 때이를 사용합니다. 이렇게하면 모든 메시지가 처리되고 누출되지 않습니다.

그러나 해결책을 이해하지 못합니다! 제가 사용하고있는 Application의 하위 클래스가 있는데이 생성자에서 창을 만들려고했으나 문제가 해결되지 않았습니다.

new HwndSource(new HwndSourceParameters("MyApplication")); 
+0

I을 난 그냥 내 응용 프로그램 생성자에이를 추가 할 필요가 같은 문자 그대로의 지시에 따라

, 그것은 보인다 확실한 대답은 없지만 다음은 도움이 될 수있는 사실입니다. "새로운 HwndSource (...)"를 수행하고 WPF를 발생시키는 데 충분하다는 것을 발견했습니다. RegisterClassEx를 호출하여 서브 클래스 화 (Win32가 서브 클래 싱이라고 부르는 것; .NET에서 "서브 클래 싱"이라고 부르는 것이 아니라), CreateWindowEx를 사용하여 새로운 hWnd를 만듭니다. 이것은 당신이 위에 쓴 라인이 당신이 연결된 특정 누수를 극복하는 데 필요한 모든 것이라고 믿게합니다. 그래서 그 문제는 아마 다른 곳에있을 것입니다. 링크의 다른 기술 중 일부가 도움이 될 수 있습니다. –

+0

네, 새로운 HwndSource를 만드는 것이 유익했음을 알았지 만 그것은 아주 새로운 빈 창을 만들었습니다. 나는 그것을 숨기는 것이 전혀없는 것만큼 나쁠 것 같아. –

+0

HwndSourceParameters에서 창 제목을 설정하지 않으면 창이 나타나지 않고 메모리 누수 문제가 해결됩니다. –

답변

6

수정 :

Application.xaml.cs

class MyApp1 : Application 
{ 
    // ... 

    public Application() 
    { 
     new HwndSource(new HwndSourceParameters()); 
    } 
    // ... 
}