日期:2014-05-17  浏览次数:20829 次

关于一个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试试
------解决方案--------------------
引用:
Quote: 引用:

多线程,更新ui卡死,不用多想了。
InvokeRequired试试

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

和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