关于一个UI卡死的问题
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,断点又被激活了,说明这个事件又被接收到了,我估计是多线程的问题,请问该怎么找出问题呢?
------解决方案--------------------DicForm[_stkForm.Peek()]代码呢?这样看不出什么
------解决方案--------------------多线程,更新ui卡死,不用多想了。
InvokeRequired试试
------解决方案--------------------
和android的机制差不多(应该是android抄袭的winform或wpf)
就是在新的线程(非ui线程)中,默认是没有改变ui控件的权限的,你用控件obj.InvokeRequired试试,如果可以,就返回false,否则就需要使用Invoke或begininvoke才行。
也可以手动关闭这个权限验证,但这是ms不推荐的。
------解决方案--------------------注:要灵活使用 InvokeRequired,必须把委托和事件玩的比较转才行,不然那些代码你看起来会非常头痛
如果会拉姆达 更佳
不然的话 还是慎用多线程为好。
如果一定要用,可以使用全局静态变量(标准bad smell),在子线程中处理结果,并保存在静态变量中,然后ui线程读取静态变量,相应的对ui控件进行操控
------解决方案--------------------不太清楚楼主的应用场景,不过,要是能不用多线程最好不要使用多线程。
使用invoke,可以方便的在子线程中去更新ui界面,其实就是操作ui线程(即主线程)中的控件。
关于可以看看资料:http://blog.sina.com.cn/s/blog_5a6f39cf0100s23x.html