Попробуйте этот код
Form1 form1 = new Form1();
//Subscribe event here
form1.MdiParent = this;
form1.Show();
Это работает для меня
Я не знаю, почему ваш код не работает, я вернусь, как только я получаю ответ.
Редактировать: У меня есть ответ.
ISynchronizationInvoke's
членов (Invoke
и BeginInvoke
) выполнены следующим образом: Control
.
- Получает контекст Thread, который создал окно.
- Сформировать новое окно MESSAGEID с помощью
RegisterWindowMessage
- Инкапсулируй делегат мы прошли в качестве параметра в
ThreadMethodEntry
добавить его во внутреннее Queue
- сообщений Управляющего сообщение для потока в очереди с MESSAGEID возвращенного
RegisterWindowMessage
использованием PostMessage
- Ручкой
WndProc
прослушивает для messageId
, затем De-queues ThreadMethodEntry
и вызывает делегата.
Что поделать не так?
Form1 form1 = new Form1(); form1.Show(); form1.MdiParent = this;
Form.Show
каким-то образом приводит к вызову OnLoad
метода, то есть где OnShown
вызывается асинхронно с помощью BeginInvoke
if (base.IsHandleCreated)
{
base.BeginInvoke(new MethodInvoker(this.CallShownEvent));//reflected code
}
Так что прежде посланной WindowMessage
получает установить form1.MdiParent = this;
, который, в свою очередь вынуждает управление Destroy
это ручка и 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")
фактически вводит в заблуждение, не так ли?
Примечание: вы можете исправить это легко, используя Application.DoEvents();
до form1.MdiParent = this;
, так как DoEvents
обрабатывает все незавершенные сообщения немедленно.
Я нашел его, обновил свой ответ –