创建控件之后还提示 “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”

takpod 2018-09-28 08:52:51
在另一个类里写
 public void ThreadRunPro()
{
Form1.fnGetInstance().test();
Thread.Sleep(1000);
}


在form1里的函数里写

  public void test()
{
try
{ this.Invoke(new Action(() => {
this.Text = "111";
})); }
catch (Exception er){ }
}

首先是在 那个Form1加载完毕很久之后才启动线程的,但是还是会提示“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”
请问该如何解决这个问题?



...全文
430 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-09-28
  • 打赏
  • 举报
回复
fnGetInstance 是什么?如何定义的?返回的是什么?

Form1.fnGetInstance() 这样返回的显然不是程序中的 this
xian_wwq 2018-09-28
  • 打赏
  • 举报
回复
ThreadRunPro是什么时候调用的?
多线程情况下,不能简单认为线程启动顺序决定执行顺序
要确保form初始化完成,
使用信号量来触发处理比较稳妥
FainSheeg 2018-09-28
  • 打赏
  • 举报
回复
多线程一直是个难点,按我的理解,你的UI线程应该只暴露一个委托给其他线程而不应该直接暴露Form1,其他线程调用委托,然后UI线程根据委托的内容对Form1进行操作;而不是其他线程直接调用Form1,然后Form1再执行什么匿名委托对自己进行操作。
pessa_zheng 2018-09-28
  • 打赏
  • 举报
回复
你这样处理 在创建invoke之前 加上这个判断 while (!this.IsHandleCreated)
{
;
}
  • 打赏
  • 举报
回复
什么叫做“创建控件之后”呢?你把一个控件放到进程 UI 控件树上了么?
takpod 2018-09-28
  • 打赏
  • 举报
回复
引用 1 楼 yangliu0512 的回复:
你的Form1虽然已经加载了,但它却不属于你新启动的线程,也就是对于你新启动的线程来说,Form1并没有创建。如果要在新线程中对Form1进行操作,请使用委托。

Action不就是一个匿名委托吗?
FainSheeg 2018-09-28
  • 打赏
  • 举报
回复
你的Form1虽然已经加载了,但它却不属于你新启动的线程,也就是对于你新启动的线程来说,Form1并没有创建。如果要在新线程中对Form1进行操作,请使用委托。
takpod 2018-09-28
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
什么叫做“创建控件之后”呢?你把一个控件放到进程 UI 控件树上了么?

哈哈 你吐槽我五年了,你总是从很高的知识层面来批评我,老实讲没有什么实质的帮助,你可以笑我的专业知识水平很低,但有时候完成一个小项目就就不太需要太高的水平,
takpod 2018-09-28
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
根据你的思路,模写了测试例。
但并没有发现你说的错误
既然不能再现错误,也就无法判定原因了
不过在你的这个架构中,Form1.fnGetInstance() 获得的 Form1 对象和 UI 中的 Form1 对象是不通的对象,前者是不会显示的
因此,你也不会看到 this.Text = "111"; 的结果

十分感谢你的热心!我明白了!Application.Run(Form1.fnGetInstance());就可以了 谢谢你 我一时大意了。
xuzuning 2018-09-28
  • 打赏
  • 举报
回复
根据你的思路,模写了测试例。
但并没有发现你说的错误
既然不能再现错误,也就无法判定原因了

不过在你的这个架构中,Form1.fnGetInstance() 获得的 Form1 对象和 UI 中的 Form1 对象是不通的对象,前者是不会显示的
因此,你也不会看到 this.Text = "111"; 的结果

takpod 2018-09-28
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
fnGetInstance 是什么?如何定义的?返回的是什么?

Form1.fnGetInstance() 这样返回的显然不是程序中的 this


public static Form1 fnGetInstance()
{
if (instance == null)
{
if (instance == null)
instance = new Form1();
}
return instance;
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧