2013-08-05 2 views
3

나는이 많은 질문과 답변으로 뜨거운 논의 주제 알고 있지만 난 여전히 다음과 같은 문제에 대한 솔루션을 찾을 수 없습니다 :.NET WebBrowser 컨트롤 및 폐기()

내가 멀티 탭의 응용 프로그램이 있습니다. 모든 탭에는 웹 브라우저 컨트롤이 있습니다. 웹 브라우저가 모든 새 탭에 대해 더 많은 메모리를 사용하고 탭 클로즈에서이 메모리를 비우지 않으면 탭 닫기 이벤트 핸들러에 Webbrowser.Dispose()를 만들기로 결정했습니다. 이것은 메모리 누출에 관해 나를 도왔다. 사용 된 RAM은 모두 닫은 후에 사용 가능합니다.

그러나 이것은 새로운 문제를 일으켰습니다. 첫 번째 Dispose() 이후 세션이 다른 모든 Webbrowser 객체에 대해 삭제 된 것처럼 보입니다. 일반적으로 프리스트 웹 브라우저에만 로그인합니다. 내가 여러 탭을 추가하면 일반적으로 자동으로 로그인됩니다. 첫 번째 Dispose() 후에 더 이상 작동하지 않으며 모든 새 탭에 로그인해야합니다.

이전 쿠키를 보존하고 새 웹 브라우저로 다시 보내려고했으나 문제가 해결되지 않았습니다. The는 파괴 된 것 같습니다.

+0

실제로 문제가 있는지 여부를 먼저 확인하는 것이 좋습니다. 메모리 사용량이 너무 커서 시스템에서 페이징이 발생합니까? 실제 메모리 사용이 증가했거나 가상 메모리 만 증가 했습니까? –

답변

2

모든 WebBrowser 인스턴스는 프로세스별로 세션을 공유합니다. 비슷한 질문에 EricLaw's answer에 따르면 세션을 분리하는 것은 불가능한 것처럼 보입니다. 에릭의 진술을 he worked as IE program manager at Microsoft으로 믿어 의심치 않습니다.

그래도 해킹을 시도하고 싶다면 CoInternetGetSession을 참조하십시오. 먼저 IInternetSession에 대한 참조를 저장하고 보유하십시오. 또한 자신 만의 URL 네임 스페이스 (RegisterNameSpace)를 등록하고 플러그 가능한 프로토콜 처리기를 구현하면 결국이 제한을 무시할 수 있습니다.

물론 과도한 소리처럼 들리고 대부분 도움이되지 않을 수 있습니다. 쿠키를 제거하고 URL을 통해 상태를 전달하는 논리를 다시 디자인하는 것이 깔끔한 솔루션 일 수 있습니다.

EDITED : 또 다른 아이디어는 실제로 Dispose()로 처리하기 전에 WebBrowser 인스턴스를 "about : blank"("about : blank")로 이동하고 DocumentComplete 이벤트를 기다려보십시오.

+0

언제 전화해야합니까? 공란입니까? 탭을 닫을 때 또는 새 탭을 열 때 전화해야합니까? – user1689823

+0

탭을 닫고 webBrowser.Dispose()를 수행하기 전에. 그런 다음 다른 탭의 세션을 유지할 수 있습니다. Dispose()를 호출하기 전에 DocumentComplete가 "about : blank"인지 확인하십시오. – Noseratio

+0

체크 아웃 했는데도 작동하지 않습니다. (새 탭을 다시 추가 한 후 응용 프로그램에서 로그인을 묻습니다. – user1689823

2

이것은 GarbageCollector-Problem 인 것 같습니다. System.GC.Collect()의 더러운 방법을 사용해 GarbageCollector를 호출하여 메모리를 확보 할 수는 있지만 문제를 해결하는 좋은 방법은 아닙니다.

당신이 말한 것 중, 이것은 포인터 문제 인 것 같습니다. Connection을 전역 변수로 선언 한 경우 해당 탭을 닫거나 처분 할 수있는 탭에서 연결을 분리해야합니다. 이벤트 Me.Closing shuld가 그렇게하는 데 도움이됩니다. 포인터가 열려 있으면 개체로 탭이 여전히 연결되어 있고 인 경우 이 GC로 지워지지 않습니다.

연결을 복제/참조하는 방법을 명확히 할 수 있다면 자세한 답변을 드릴 수 있습니다.

편집 : 잠시 후 내 걱정이 사실이되었습니다. IE에서 캐싱에 문제가 있습니다 (> 5까지 아는 한).http://social.msdn.microsoft.com/Forums/ie/en-US/88c21427-e765-46e8-833d-6021ef79e0c8/memory-leak-in-ie-webbrowser-control

제안은 다음과 같습니다 GarbageCollector를 호출

  • 수동

  • 제한 MEMUSAGE (응용 프로그램 충돌이 발생할 또한 바로 디스크에 페이지를 기록 할 수 있습니다)에 대한

  • 을 :에 블랑 캐시 항목을 오버라이드

  • 재정의 할 C++ 메소드 호출 캐시 (나는 실제 닷넷 구현을 모르고는이 메모리 누수가있을 수 있습니다) C++에서 WinInet 사용

  • (WinINet이 - 아마도이 C# WebBrowser control: Clearing cache without clearing cookies 작품 - 모든 내가 찾은 몇 가지 ProtectedMemory-오류 결과) 도마뱀과 같은 IE에

  • 사용하여 대안 (모질라) - 귀하의 답변 https://bitbucket.org/geckofx/

1

감사합니다. 여기에 체크 아웃 무엇 :

호출 GC 수동 : 전에에서 Webbrowser.Dispose()를 사용하는 경우

  • 은 도움이 않습니다. 그러나이 문제는 세션 문제 때문에 해결할 수 없습니다.

한도 메모리 사용 :

  • 아니 솔루션입니다. 이 프로그램은 탭을 여러 번 열고 닫는 하루 종일 실행해야합니다. 빈 : 내가 사용하는 메모리를 청소 할 수없는 경우, 메모리 사용량이

에 대한 .. 몇 시간 후에 너무 많은 것

  • 이 나는 ​​약이라고 : 탭 닫기에 빈. 이 URL에 대해 DocumentLoaded가 발생하면 웹 브라우저가 삭제되었습니다. 직접 Dispose를 호출하는 것과 같은 절차. 세션이 중단됩니다.

다른 구성 요소는 다음 (독점) 인터넷 응용 프로그램은 IE 8 이상을 지원하기 때문에

  • 나는 모든 경우에 IE 컨트롤이 필요합니다.

"C++ 사용하고 WinInet이"

  • 내가 내 .NET 프로그램에서 C++ 브라우저를 사용할 수 있습니까? 전체 프로그램을 C++로 전환 할 수는 없습니다. 이것은 나를위한 해결책이 아닐 것입니다.

    내 응용 프로그램이 폐기없이 잘 작동하지만, 증가 메모리 사용에 문제가있다 : 요약

.우리가 이것을위한 솔루션을 찾을 수 있다면 (불가능한 것 같습니다) 최상의 솔루션이 될 것입니다.

나에게 맞는 "해결 방법"이 될 수있는 유일한 방법은 "닫힌"웹 브라우저를 다시 사용하는 것입니다. 자세히 : 모든 탭 닫기에서 Webbrowser를 Dispose 대신 목록에 추가합니다. 새 탭이 필요할 때 목록의 첫 번째 항목을 다시 사용하고 새 URL로 이동합니다. 시도했지만 세션과 동일한 문제가있는 것으로 보입니다. 재사용 된 탭의 세션은 새로운 것으로 보입니다. 그러나 나는 정말로 이유를 이해하지 못한다 ... 이것에 대한 제안도 역시?

또 다른 해결 방법은 모든 Webbrowser 개체를 강제로 단일 인스턴스로 만드는 것입니다. 이것이 가능한가?

+0

C#에서 내부 DHTML 또는 JavaScript 객체에 액세스 할 수 있습니까 (webBrowser.InvokeScript 또는 webBrowser.Document를 통해)? 관리 객체와 COM 객체 사이의 순환 참조가 발생할 수 있습니다. 메모리 사용량이 증가하는 이유를 설명 할 수 있습니다. – Noseratio

+0

아니요, HTML 문서를 사용하지 않습니다. – user1689823