试试这个代码
Form1 form1 = new Form1();
//Subscribe event here
form1.MdiParent = this;
form1.Show();
这对我有用
我不知道为什么您的代码不起作用,一旦我得到答案,我会回复。
编辑:我现在得到了答案。
ISynchronizationInvoke's
成员 (Invoke
和BeginInvoke
) 由Control
类实现如下。
- 获取创建窗口的线程的上下文。
- 使用生成一个新窗口 messageId
RegisterWindowMessage
- 封装我们作为参数传递的委托,
ThreadMethodEntry
将其添加到控件的内部Queue
RegisterWindowMessage
使用返回的 messageId 将消息发布到线程的队列PostMessage
- Handles
WndProc
监听messageId
然后 De-queuesThreadMethodEntry
并调用委托。
这里出了什么问题?
表格 1 表格 1 = 新表格 1(); form1.Show(); form1.MdiParent = 这个;
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
并将其状态设置为已完成,而不调用委托但将其标记为 throw 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();
before轻松解决此问题,form1.MdiParent = this;
因为DoEvents
会立即处理所有未决消息。