WebBrowser 컨트롤이있는 양식을 닫을 때 왜 raceonrcwcleanup 오류가 발생합니까?

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

문제

vs2008, .net 2, vb.net, xp ...

웹 브라우저 컨트롤과 닫기 버튼이있는 Windows 양식이 있습니다. Me.Close. 양식의 취소 버튼이 닫기 버튼으로 설정되어 ESC를 눌러 양식을 닫을 수 있습니다.

나는 그것을 설정했다 DocumentText 로드 이벤트에서 웹 브라우저 컨트롤의 속성 및 HTML이 표시됩니다.

Visual Studio에서 응용 프로그램을 실행하면 닫기 버튼을 클릭하면 양식이 오류없이 닫힙니다.

ESC 버튼을 누르면 얻을 수 있습니다

Raceonrcwcleanup은 메시지가 감지되었습니다. 사용중인 RCW를 해제하려는 시도가 이루어졌습니다. RCW는 활성 스레드 또는 다른 스레드에서 사용됩니다. 사용 중 RCW를 풀려고하면 부패 또는 데이터 손실이 발생할 수 있습니다.

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

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

미리 감사드립니다.

도움이 되었습니까?

해결책

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

당신은? 그렇지 않다면, 그것에 대해 잠을 잃지 마십시오. COM은 원형 참조를 해결할 수없는 것으로 유명한 참조 계산을 사용합니다.


좋아, 나는 이것에 대한 재현을 받았다. 예, 이것은 양식의 취소 버튼 속성 또는 버튼의 Dialogresult 속성에 의해 트리거됩니다. 이것은 WB가 초점을 맞추면 탈출 키 프레스를 볼 때 발생합니다. ActiveX 배관의 일부는 컨테이너에 그것에 대해 알리면 부작용이 있어야하는 키 스트로크에 응답 할 수 있습니다. 바로 가기 키 스트로크, 탭, 입력. 그리고 탈출. 버튼이 양식을 닫으면 디버거는 스택의 RCW 코드에서 활성 스택 프레임이있는 동안 WB가 배치되는 것을 볼 수 있습니다. 위험은 COM 구성 요소가 릴리스 된 이후로 호출 된 코드가 반환 될 때 충돌이 발생할 수 있다는 것입니다.

이 충돌을 볼 가능성은 거의 없지만 버튼의 클릭 이벤트가 반환되기 직전에 파이널 라이저 스레드가 실행될 때 폭탄이 발생할 수 있다고 상상할 수 있습니다. MDA와 잠재적 인 충돌의 해결 방법은 ActiveX 코드가 실행 중지 될 때까지 양식 폐쇄를 지연시키는 것입니다. 컨트롤로 우아하게 수행됩니다 .BeginInvoke (). 이와 같이:

    private void CancelButton_Click(object sender, EventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { this.Close(); });
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top