C# 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

时间:2022-08-27 17:16:51
现在情况是这样的:

有三个窗体:主窗体 A ,窗体 B,窗体 C  ,全局委托 D


A窗体 调用 B 显示; B调用全局委托 D 获取数据,同时 打开 C 窗体显示等待

窗体A 接收到 全局委托D线程 异步发送来的 消息,用 委托异步执行 关闭 B窗体,出现  创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

请分析下 为什么会是这样,我想理解下真正的过程。。。感激不禁!!

A 窗体 接收到 全局委托 D 异步发送来的消息后调用 关闭 B窗体的代码:

DisplayTipHandle handle = new DisplayTipHandle(LoginMsg);
                this.BeginInvoke(handle, "false");        


9 个解决方案

#1


DisplayTipHandle是什么,this是什么?LoginMsg又是什么?
你这样给代码,让别人怎么帮你分析?

#2


引用 1 楼 qldsrx 的回复:
DisplayTipHandle是什么,this是什么?LoginMsg又是什么?
你这样给代码,让别人怎么帮你分析?


是我考虑不全

DisplayTipHandle 是定义了一个委托;
 // 委托 调用UI上的控件
 private delegate void DisplayTipHandle(String tip);

LoginMsg 是一个函数,用来 关闭 窗体 B 

因为 这段 代码 是写在 窗体 A 的 cs 里面的,所以 this 按照我的理解应该是 窗体 A

#3


B调用全局委托 D 获取数据,这个调用是不是在构造函数里面执行的,如果是的话,那个委托的执行应该在B的控件句柄创建之前就执行完毕了,此时发送给A消息,但是B尚未初始化完毕,自然无法立刻关闭。
建议B在Load事件中调用全局委托 D,因为Load事件是在创建窗口句柄之后执行的事件。

#4


引用 3 楼 qldsrx 的回复:
B调用全局委托 D 获取数据,这个调用是不是在构造函数里面执行的,如果是的话,那个委托的执行应该在B的控件句柄创建之前就执行完毕了,此时发送给A消息,但是B尚未初始化完毕,自然无法立刻关闭。
建议B在Load事件中调用全局委托 D,因为Load事件是在创建窗口句柄之后执行的事件。


B调用全局委托 D 获取数据,这个调用  不是 在构造函数里面执行的,窗体B 是登录框,A是主函数, 窗体B 是用户点击登录了,发送全局委托去 查询数据库 并 调用 窗体 C 显示 等待。 数据库 返回的数据,我用 异步 回调全局委托 D, 这样 窗体 A 才接收到异步全局委托的数据,用 委托调用 主进程的函数 来 关闭 窗体B 程序。

#5



if( this.IsHandleCreated )
{
   this.BeginInvoke(...);
}

#6


引用 5 楼 gomoku 的回复:
C# code

if( this.IsHandleCreated )
{
   this.BeginInvoke(...);
}


这个试过了, Handle 一直没有创建,跳不进去的

#7


引用 6 楼 zhuimeng11025 的回复:
这个试过了, Handle 一直没有创建,跳不进去的

既然“窗口都还没有创建”,跳进去有什么用处?

#8


引用 7 楼 gomoku 的回复:
引用 6 楼 zhuimeng11025 的回复:
这个试过了, Handle 一直没有创建,跳不进去的

既然“窗口都还没有创建”,跳进去有什么用处?


是检测到都没有创建
运行过程前面也说过了

启动项: 窗口 A =>调用弹出 窗口 B=>调用全局委托 D 并且 显示 弹出 窗口 C 

全局委托 D 用线程 回调, 窗口A 接收到 回来的消息, 用委托 调用 进程 关闭窗口B 时

出现 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke


这个方法可能有问题,但是就是不太理解为什么不能这么回调?

#9


引用 8 楼 zhuimeng11025 的回复:
...但是就是不太理解为什么不能这么回调?

我在下帖的三楼有解释,3年前的帖子了:)
http://topic.csdn.net/u/20091129/23/1dae9f08-5396-421f-9c1f-0d7b4269bd7d.html

#1


DisplayTipHandle是什么,this是什么?LoginMsg又是什么?
你这样给代码,让别人怎么帮你分析?

#2


引用 1 楼 qldsrx 的回复:
DisplayTipHandle是什么,this是什么?LoginMsg又是什么?
你这样给代码,让别人怎么帮你分析?


是我考虑不全

DisplayTipHandle 是定义了一个委托;
 // 委托 调用UI上的控件
 private delegate void DisplayTipHandle(String tip);

LoginMsg 是一个函数,用来 关闭 窗体 B 

因为 这段 代码 是写在 窗体 A 的 cs 里面的,所以 this 按照我的理解应该是 窗体 A

#3


B调用全局委托 D 获取数据,这个调用是不是在构造函数里面执行的,如果是的话,那个委托的执行应该在B的控件句柄创建之前就执行完毕了,此时发送给A消息,但是B尚未初始化完毕,自然无法立刻关闭。
建议B在Load事件中调用全局委托 D,因为Load事件是在创建窗口句柄之后执行的事件。

#4


引用 3 楼 qldsrx 的回复:
B调用全局委托 D 获取数据,这个调用是不是在构造函数里面执行的,如果是的话,那个委托的执行应该在B的控件句柄创建之前就执行完毕了,此时发送给A消息,但是B尚未初始化完毕,自然无法立刻关闭。
建议B在Load事件中调用全局委托 D,因为Load事件是在创建窗口句柄之后执行的事件。


B调用全局委托 D 获取数据,这个调用  不是 在构造函数里面执行的,窗体B 是登录框,A是主函数, 窗体B 是用户点击登录了,发送全局委托去 查询数据库 并 调用 窗体 C 显示 等待。 数据库 返回的数据,我用 异步 回调全局委托 D, 这样 窗体 A 才接收到异步全局委托的数据,用 委托调用 主进程的函数 来 关闭 窗体B 程序。

#5



if( this.IsHandleCreated )
{
   this.BeginInvoke(...);
}

#6


引用 5 楼 gomoku 的回复:
C# code

if( this.IsHandleCreated )
{
   this.BeginInvoke(...);
}


这个试过了, Handle 一直没有创建,跳不进去的

#7


引用 6 楼 zhuimeng11025 的回复:
这个试过了, Handle 一直没有创建,跳不进去的

既然“窗口都还没有创建”,跳进去有什么用处?

#8


引用 7 楼 gomoku 的回复:
引用 6 楼 zhuimeng11025 的回复:
这个试过了, Handle 一直没有创建,跳不进去的

既然“窗口都还没有创建”,跳进去有什么用处?


是检测到都没有创建
运行过程前面也说过了

启动项: 窗口 A =>调用弹出 窗口 B=>调用全局委托 D 并且 显示 弹出 窗口 C 

全局委托 D 用线程 回调, 窗口A 接收到 回来的消息, 用委托 调用 进程 关闭窗口B 时

出现 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke


这个方法可能有问题,但是就是不太理解为什么不能这么回调?

#9


引用 8 楼 zhuimeng11025 的回复:
...但是就是不太理解为什么不能这么回调?

我在下帖的三楼有解释,3年前的帖子了:)
http://topic.csdn.net/u/20091129/23/1dae9f08-5396-421f-9c1f-0d7b4269bd7d.html