이 코드
Form1 form1 = new Form1();
//Subscribe event here
form1.MdiParent = this;
form1.Show();
시도
이것은 나를 위해 작동
난 당신의 코드가 작동하지 않는 이유는 답을하면, 내가 돌아올거야 모른다.
편집 : 지금 대답을 얻었습니다.
ISynchronizationInvoke's
회원 (Invoke
및 BeginInvoke
)은 다음과 같이 Control
클래스로 구현됩니다.
- 창을 만든 스레드의 컨텍스트를 가져옵니다.
- 는
PostMessage
- 이
WndProc
를 처리하여 RegisterWindowMessage
에 의해 반환 messageId가와 큐 우리가 ThreadMethodEntry
에 매개 변수로 전달 된 대리자를 캡슐화 RegisterWindowMessage
- 을 사용하여 새 창 messageId가 생성의 스레드 제어의 내부
Queue
- 게시물 메시지에 추가 수신 대기열은
messageId
이고 대기열은 ThreadMethodEntry
이며 대기열을 호출합니다.
여기에 무슨 문제가 있습니까?
Form1 form1 = new Form1(); form1.Show(); form1.MdiParent = this;
Form.Show
어떻게 든 OnLoad
메소드 호출 결과, 그 OnShown
이 게시 된 WindowMessage
이 Destroy
로 차례로 컨트롤을 강제로 form1.MdiParent = this;
을 설정 받기 전에 BeginInvoke
if (base.IsHandleCreated)
{
base.BeginInvoke(new MethodInvoker(this.CallShownEvent));//reflected code
}
그래서 그것을 처리 할 것 사용하여 비동기 적으로 호출하고있는 곳입니다 ReCreate
새 핸들.
DestroyHandle
방법은 PeekMessage
기능을 사용하여 얻는하여 게시 된 메시지를 삼킨 다음 Queue
의 모든 요소를 열거하고 대리자를 호출하지만 ObjectDisposedException
을 던져 그것을 표시없이 완료로 상태를 설정합니다.
Form1 form1 = new Form1();
form1.Show();
Action del =() =>
{
Console.WriteLine("This will never be called");//our custom delegates too fails to be invoked
};
var res = form1.BeginInvoke(del);
//after some more code
form1.EndInvoke(res);//throws `ObjectDisposedException` which was marked previously
form1.MdiParent = this;
투구 ObjectDisposedException("Control")
실제로 오해의 소지가 있습니까?
참고 : DoEvents
은 모든 보류중인 메시지를 즉시 처리하므로 보다 먼저 form1.MdiParent = this;
을 사용하면 쉽게 해결할 수 있습니다.
나는 그것을 찾았습니다. 내 대답을 업데이트했습니다. –