首页 新闻 会员 周边 捐助

C#主线程如何访问其他线程创建的控件

0
悬赏园豆:40 [已解决问题] 解决于 2013-09-03 19:50

主线程里有一个Dictionary<int,Form>的属性,我在支线程里创建了一个Form窗口,并调用主线程的那个属性将创建的Form添加到了Dictionary当中,可是当我用Dict[xx].Show()显示窗口的时候,程序卡死了。

一羽赐命的主页 一羽赐命 | 初学一级 | 园豆:11
提问于:2013-04-26 00:21
< >
分享
最佳答案
0

把那代码写在这里面试试:

this.Invoke((MethodInvoker)delegate{
this.Memo.Text+= value +"\n";
});
收获园豆:40
悟行 | 专家六级 |园豆:12559 | 2013-04-26 09:45
其他回答(3)
0

代码贴出来看看。(卡死有没有抛出异常啊)

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-26 09:46

另外我觉得你这样创建的form无法在主线程访问,因为form的支线程已经被释放,并且你的form也没有对应句柄,所以你无法调用form.invoke()。。。但倘若你像楼上说的在this.invoke()中创建form的话就达不到异步的效果,还不如直接在主线程创建来的高效。。。所以的建议是:

1、如果你的form构造函数确实耗时,那么应该考虑为你的构造函数中耗时的函数进行异步,而不是异步创建form。

2、倘若你一定要异步创建form,那么你在支线程中这样去写

// 支线程中
Form frm1=new Form();
Application.Run(frm1);
frm.Hide();

// 主线程中调用
dic[xx].Invoke(()=>{dic[xx].Show()});
支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-26 09:55
0

为什么在子线程里创建窗体?需求很怪啊

会长 | 园豆:12461 (专家六级) | 2013-04-26 18:41
0

Dict[xx].ShowDialog()

程序诗人 | 园豆:313 (菜鸟二级) | 2013-06-04 15:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册