线程间如何访问控件方法?

wanbolantian 2014-06-22 10:59:19
我有一个主窗口,上面有一个按钮,这个按钮要加载A窗口,而A窗口由于业务需要,放了大量的图片和第三方控件,导致加载时很慢,为避免用户以为窗体卡死,我开启了一个新线程,在这个线程里加载B窗口,用于显示一个动画,提示用户正在加载窗体A。现在的问题是,如何在加载完窗体A后,让B窗口关闭?我试过如下代码,但会提示“窗口不是该线程创建,不能访问”。网上搜了一下,都说的是用委托来安全访问线程控件,但看得不太明白,能根据我的代码给点提示么?多谢!

VMS.frm.system.floading floading = new frm.system.floading();

Task task = new Task(() =>
{
floading.ShowDialog();
});

task.Start();

frm.vmsMGT.fCheckIn fCheckIn = new frm.vmsMGT.fCheckIn();
this.createTab(fCheckIn);
floading.Close();
...全文
321 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
挑粪编码员 2014-06-24
  • 打赏
  • 举报
回复
引用 11 楼 wanbolantian 的回复:
[quote=引用 10 楼 qq178582223 的回复:] 控件之间的操作一般都是用委托!LZ可以看下委托的概念
看过网上的文章,也知道要用委托来实现,但就是不知道如何在我这个示例中运用委托来解决问题。大侠们能在我的代码基础上,指点下如何用委托来解决不?[/quote]

private delegate void delegateCloseForm(); //声明的委托
private void CloseForm() //用来专门关掉当前窗体的方法
this.Invoke(new delegateCloseForm(CloseForm));//调用委托,在主线程UI上使用
Conmajia 2014-06-24
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390162519 祝你木有小JJ
  • 打赏
  • 举报
回复
引用 4 楼 sj178220709 的回复:
记住一个设计原则, 不要再ui线程里面干耗时操作, 不要再非ui线程里面操作ui元素, 比如你这里的在子线程创建ui控件,创建的控件会设置它的线程句柄为这个子线程(非ui线程),也就是说你在ui线程中就不能访问这个控件了,得去invoke子线程来访问它,一下子就乱套了.
只看你的文字 没看代码, 我纠正一点 你是在子线程中访问 floading 报错了, 需要invoke 主线程去访问, 然后,你的多线程逻辑整个都是乱的,自己再理理吧.
  • 打赏
  • 举报
回复
记住一个设计原则, 不要再ui线程里面干耗时操作, 不要再非ui线程里面操作ui元素, 比如你这里的在子线程创建ui控件,创建的控件会设置它的线程句柄为这个子线程(非ui线程),也就是说你在ui线程中就不能访问这个控件了,得去invoke子线程来访问它,一下子就乱套了.
wanbolantian 2014-06-23
  • 打赏
  • 举报
回复
引用 10 楼 qq178582223 的回复:
控件之间的操作一般都是用委托!LZ可以看下委托的概念
看过网上的文章,也知道要用委托来实现,但就是不知道如何在我这个示例中运用委托来解决问题。大侠们能在我的代码基础上,指点下如何用委托来解决不?
失落的神庙 2014-06-23
  • 打赏
  • 举报
回复
线程安全问题要注意。
於黾 2014-06-23
  • 打赏
  • 举报
回复
把B放到静态类里去,在类里创建窗口和线程. 主窗口调用静态类的方法使B显示,窗口A调用静态类中另一个方法使B关闭. 线程变量和窗口句柄都设置为静态全局变量,避免第二次调用时找不到之前创建的线程和窗口.
kxyzjm62 2014-06-23
  • 打赏
  • 举报
回复
http://hi.baidu.com/fsyiyun/item/e3a7ac0c8d3b99076d90486f
挑粪编码员 2014-06-23
  • 打赏
  • 举报
回复
控件之间的操作一般都是用委托!LZ可以看下委托的概念
梦吟情诗 2014-06-23
  • 打赏
  • 举报
回复
用Invoke加委托就能搞定不同线程间的控件操作
threenewbee 2014-06-22
  • 打赏
  • 举报
回复
将耗时的代码放在新线程中,在新线程操作UI,使用Invoke方法传委托,就这么简单。
wanbolantian 2014-06-22
  • 打赏
  • 举报
回复
但this.createTab这个创建窗体的方法里,由于引用了主窗体上的某些控件,如果把它放到线程里,它又不会访问不到主窗体上的控件了,因为主窗体上的控件是UI线程创建的。
  • 打赏
  • 举报
回复
你完全本末倒置了。 你的计算才应该放到线程中,你的UI操作(加载B窗口)则应该在A窗口主线程中。

110,538

社区成员

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

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

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