2009-12-09 5 views
20

VS2008, .NET 2, VB.NET, XP ...WebBrowser 컨트롤이있는 폼을 닫을 때 왜 RaceOnRCWCleanup 오류가 발생합니까?

은 그냥 Me.Close 않는 웹 브라우저 컨트롤과 닫기 버튼으로 윈도우 형태를 갖는다. 양식의 취소 버튼은 닫기 버튼으로 설정되어 있기 때문에 ESC를 눌러 양식을 닫을 수 있습니다.

로드 이벤트에서 WebBrowser 컨트롤의 DocumentText 속성을 설정하면 HTML이 표시됩니다.

Visual Studio에서 응용 프로그램을 실행하고 닫기 단추를 누르면 오류없이 양식이 닫힙니다. 나는 ESC 버튼을 누르면 경우

나는

RaceOnRCWCleanup가 감지 메시지를 얻을 : 시도가 사용 중입니다 이없는 RCW에 만들어졌다. RCW 이 활성 스레드에서 사용되고 있거나 다른 스레드에서 사용 중입니다. 사용중인 RCW를 에서 해제하려고하면 데이터가 손상되거나 데이터가 손실 될 수 있습니다.

VS 외부에서 앱을 실행하면 오류가 발생하지 않습니다.

어떤 아이디어입니까? a) 왜 오류입니까? b) 방지하거나 억제하는 방법은 무엇입니까?

미리 감사드립니다.

답변

30

오류가 아니므로 경고입니다. 매니지드 코드 용 디버거의 확장 인 MDA (Managed Debugging Assistant)에 의해 작성되었으며, 코드에서 문제가 발생하고 있다고 생각합니다. 신발이 맞습니다. RCW를 사용하고 있습니다. WebBrowser는 COM 컨트롤입니다. RCW를 죽이고, 양식을 닫습니다. MDA는 웹 브라우저가 사용 중이며 요청이 완료되기 전에 죽는다고 생각하기 때문에 들어갑니다. 일반적으로 코드에서 스레드를 사용하는 경우에만 해당됩니다.

너니? 그렇지 않은 경우에는 잠을 자지 마십시오. COM은 순환 참조를 해결할 수없는 것으로 유명한 레퍼런스 카운팅을 사용합니다.


좋아요,이 의견에 대한 답을 얻었습니다. 예, 이것은 폼의 CancelButton 속성이나 버튼의 DialogResult 속성에 의해 트리거됩니다. 이것은 WB에 포커스가있을 때 발생합니다. 이스케이프 키가 눌립니다. ActiveX 배관의 일부는 컨테이너에 대해 알려주므로 부작용이있는 키 입력에 응답 할 수 있습니다. 바로 가기 키 입력, Tab, Enter. 그리고 탈출. 그런 다음 단추가 폼을 닫으면 스택에 RCW 코드의 활성 스택 프레임이있는 동안 디버거에서 WB가 처리되는 것을 봅니다. COM 구성 요소가 릴리스 된 후 호출 된 코드가 반환 될 때 충돌이 발생할 수있는 위험이 있기 때문에 흔하지 않습니다.

이 충돌을 보는 것은 거의 불가능하지만 버튼의 Click 이벤트가 반환되기 바로 전에 finalizer 스레드가 실행되면 폭탄이 터질 수 있다고 상상할 수 있습니다. MDA와 잠재적 인 충돌에 대한 해결 방법은 ActiveX 코드 실행이 중지 될 때까지 양식 닫기를 지연하는 것입니다. 우아하게 Control.BeginInvoke()를 사용하여 완료되었습니다. 이와 같이 :

private void CancelButton_Click(object sender, EventArgs e) { 
     this.BeginInvoke((MethodInvoker)delegate { this.Close(); }); 
    } 
+2

아니, 그것은 모두 포 그라운드 스레드에서 발생합니다. 사실 나를 괴롭히는 것은 아닙니다. VS에서 스위치를 끄는 방법이 있습니다.Close 버튼을 클릭하여 Close 이벤트 핸들러를 호출하면 * 발생하지 않지만 Close 버튼은 폼의 Cancel 버튼 속성이므로 ESC를 눌러 동일한 핸들러를 호출하면 * * 않습니다. 왜 다른가요? – ChrisA

+2

이 정확한 시나리오를보고 있습니다. 웹 브라우저를 사용하여 양식을 닫으므로 문제가되지 않습니다. ESC 키를 누르고 'X'키를 누르는 것의 차이점을 이해하고 싶습니다. – mpeterson

+0

@chris, @mpeterson - 재판 및 해결책을 얻었으며 업데이트 소식이 게시되었습니다. –

관련 문제