关于一个UI卡死的问题

权仔 2013-04-25 10:26:28
        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
if (_stkForm.Count != 0)
{
MyForm frm=DicForm[_stkForm.Peek()];
frm.Show();
MessageBox.Show("asdfasdfsdf");
}
}

MyForm frm=DicForm[_stkForm.Peek()];这行我设了个断点,frm能获取到一个窗口,但是就是Show不出来~~~~~点一下notify主窗口就直接卡死。MessageBox.Show("asdfasdfsdf");这句的窗口也弹不出来。但是我再点一下notify,断点又被激活了,说明这个事件又被接收到了,我估计是多线程的问题,请问该怎么找出问题呢?
...全文
209 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
三五月儿 2013-04-28
  • 打赏
  • 举报
回复
不太清楚楼主的应用场景,不过,要是能不用多线程最好不要使用多线程。 使用invoke,可以方便的在子线程中去更新ui界面,其实就是操作ui线程(即主线程)中的控件。 关于可以看看资料:http://blog.sina.com.cn/s/blog_5a6f39cf0100s23x.html
  • 打赏
  • 举报
回复
注:要灵活使用 InvokeRequired,必须把委托和事件玩的比较转才行,不然那些代码你看起来会非常头痛 如果会拉姆达 更佳 不然的话 还是慎用多线程为好。 如果一定要用,可以使用全局静态变量(标准bad smell),在子线程中处理结果,并保存在静态变量中,然后ui线程读取静态变量,相应的对ui控件进行操控
  • 打赏
  • 举报
回复
引用 4 楼 daimeiquan 的回复:
[quote=引用 3 楼 sj178220709 的回复:] 多线程,更新ui卡死,不用多想了。 InvokeRequired试试
主线程里有一个Dictionary<int,Form>的属性,我在支线程里创建了一个Form窗口,并调用主线程的那个属性将创建的Form添加到了Dictionary当中,可是当我用Dict[xx].Show()显示窗口的时候,程序卡死了。Invoke看不怎么懂啊,能讲解一下吗~~~[/quote] 和android的机制差不多(应该是android抄袭的winform或wpf) 就是在新的线程(非ui线程)中,默认是没有改变ui控件的权限的,你用控件obj.InvokeRequired试试,如果可以,就返回false,否则就需要使用Invoke或begininvoke才行。 也可以手动关闭这个权限验证,但这是ms不推荐的。
权仔 2013-04-26
  • 打赏
  • 举报
回复
引用 3 楼 sj178220709 的回复:
多线程,更新ui卡死,不用多想了。 InvokeRequired试试
主线程里有一个Dictionary<int,Form>的属性,我在支线程里创建了一个Form窗口,并调用主线程的那个属性将创建的Form添加到了Dictionary当中,可是当我用Dict[xx].Show()显示窗口的时候,程序卡死了。Invoke看不怎么懂啊,能讲解一下吗~~~
  • 打赏
  • 举报
回复
多线程,更新ui卡死,不用多想了。 InvokeRequired试试
权仔 2013-04-25
  • 打赏
  • 举报
回复
引用 1 楼 xtiu77 的回复:
DicForm[_stkForm.Peek()]代码呢?这样看不出什么
private Dictionary<int, MyForm > _dicForm = new Dictionary<int, MyForm >(); private Stack<int> _stkForm = new Stack<int>();
xtiu77 2013-04-25
  • 打赏
  • 举报
回复
DicForm[_stkForm.Peek()]代码呢?这样看不出什么

110,499

社区成员

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

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

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