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,断点又被激活了,说明这个事件又被接收到了,我估计是多线程的问题,请问该怎么找出问题呢?
{
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,断点又被激活了,说明这个事件又被接收到了,我估计是多线程的问题,请问该怎么找出问题呢?
private Stack<int> _stkForm = new Stack<int>();
InvokeRequired试试
和android的机制差不多(应该是android抄袭的winform或wpf)
就是在新的线程(非ui线程)中,默认是没有改变ui控件的权限的,你用控件obj.InvokeRequired试试,如果可以,就返回false,否则就需要使用Invoke或begininvoke才行。
也可以手动关闭这个权限验证,但这是ms不推荐的。
如果会拉姆达 更佳不然的话 还是慎用多线程为好。如果一定要用,可以使用全局静态变量(标准bad smell),在子线程中处理结果,并保存在静态变量中,然后ui线程读取静态变量,相应的对ui控件进行操控
使用invoke,可以方便的在子线程中去更新ui界面,其实就是操作ui线程(即主线程)中的控件。
关于可以看看资料:http://blog.sina.com.cn/s/blog_5a6f39cf0100s23x.html