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,断点又被激活了,说明这个事件又被接收到了,我估计是多线程的问题,请问该怎么找出问题呢?

解决方案 »

  1.   

    DicForm[_stkForm.Peek()]代码呢?这样看不出什么
      

  2.   

     private Dictionary<int, MyForm > _dicForm = new Dictionary<int, MyForm >();
            private Stack<int> _stkForm = new Stack<int>();
      

  3.   

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

  4.   

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

  5.   

    主线程里有一个Dictionary<int,Form>的属性,我在支线程里创建了一个Form窗口,并调用主线程的那个属性将创建的Form添加到了Dictionary当中,可是当我用Dict[xx].Show()显示窗口的时候,程序卡死了。Invoke看不怎么懂啊,能讲解一下吗~~~
    和android的机制差不多(应该是android抄袭的winform或wpf)
    就是在新的线程(非ui线程)中,默认是没有改变ui控件的权限的,你用控件obj.InvokeRequired试试,如果可以,就返回false,否则就需要使用Invoke或begininvoke才行。
    也可以手动关闭这个权限验证,但这是ms不推荐的。
      

  6.   

    注:要灵活使用 InvokeRequired,必须把委托和事件玩的比较转才行,不然那些代码你看起来会非常头痛
    如果会拉姆达 更佳不然的话 还是慎用多线程为好。如果一定要用,可以使用全局静态变量(标准bad smell),在子线程中处理结果,并保存在静态变量中,然后ui线程读取静态变量,相应的对ui控件进行操控
      

  7.   

    不太清楚楼主的应用场景,不过,要是能不用多线程最好不要使用多线程。
    使用invoke,可以方便的在子线程中去更新ui界面,其实就是操作ui线程(即主线程)中的控件。
    关于可以看看资料:http://blog.sina.com.cn/s/blog_5a6f39cf0100s23x.html