private void button1_Click(object sender, EventArgs e)
        {
            fortest test = new fortest(NewMethod);
            test.Invoke();
            //NewMethod();
        }        private static void NewMethod()
        {
            string aa = "";
            for (int i = 0; i < 200; i++)
            {
                if (i == 198)
                {
                    aa = "123";
                    MessageBox.Show(aa);
                }
            }
        }
如果直接调用这个循环方法UI会死掉,但是如果用一个委托的Invoke方法则不会,原因是什么?

解决方案 »

  1.   

    同步(直接调用)、异步(invoke)。
      

  2.   

    fortest呢?这个里面开新线程了吧
      

  3.   

    楼上的搞什么灰机Invoke必须不是异步调用BeginInvoke才是异步调用
      

  4.   

    直接调用的话UI线程一直在处理循环,所以界面假死了。用BeginInvoke是异步调用,所以UI线程还能处理界面事件,不会假死。
      

  5.   

    调用委托的BeginInvoke异步方法需要将委托对象给传过去,但是用Invoke方法则不需要,我知道如果调用BeginInvoke就相当于另起一个线程,但是Invoke呢?它相当于什么?运行的时候还是由当前线程执行吗?
      

  6.   

    那个传递的是个回调啦,不是你想的那回事
    BeginInvoke肯定要起新线程
    Invoke跟直接调用没啥区别
      

  7.   

    你确定不死?我怎么试了下,循环变量加大后,很明显是UI是死的,不管用不用Invoke
      

  8.   

    楼主是不是想用test.BeginInvoke,但是发现这个方法还要参数,Invoke不需要参数,不知道填什么吧?那个是回调方法,你这儿不用回调,直接给两个null就行了呀
      

  9.   

    200次循环内,差别很明显的,次数太大的我也没试过。回调我了解,但是委托的Invoke到底是什么那位能给个准确的答案?
      

  10.   

    我想委托里面有俩个异步方法,一个是Invoke,一个是BeginInvoke,俩个方法都是用线程池中的线程执行线程函数!
      

  11.   


    不明白你的200次是什么意思?200吃太少了,几乎没有区别,都是立即结束,如果加大循环,
    test.Invoke();也好NewMethod();也好,界面都是死掉的,除非你用BeginInvoke,这样界面不会死
      

  12.   

    以前一直觉得是一样的 所以看lz的说法觉得有点诧异
    以下摘自msdn
    公共语言运行时为每个委托类型提供 Invoke 方法(使用与该委托相同的签名)。 不必从 C#、Visual Basic 或 Visual C++ 显式调用此方法,因为编译器将自动调用此方法。 需要查找委托类型的签名时 Invoke 方法在 反射 上很有用。