日期:2014-05-18  浏览次数:20908 次

this.invoke(委托)启动的真是子线程吗
做过几个试验

不多说 看代码

程序一:
C# code

            for (long i = 1; i <= 90000000; i++)
            {
                Console.WriteLine(i);
            }
  private void button1_Click(object sender, EventArgs e)
        {
          Thread  t = new Thread(new ThreadStart(m));
            t.Start();
        }



结论1
由于输出是子线程做的 所以输出过程中 窗体仍可以正常使用
主窗体仍可操作

程序二
程序二就是网络上被复制了N遍的子线程操作窗体的方法(大同小异),主要就是通过委托+invoke
C# code

         public void t()
        {
           MessageBox.Show(Thread.CurrentThread.Name);//step1
            for (long i = 1; i <= 90000000; i++)
            {
                Console.WriteLine(i);
            }
       }
public delegate void dt();

        public void run()
        {
            dt d = new dt(new ThreadStart(t));
            this.Invoke(d, new Object [] { });
        }
           Thread  t = new Thread(new ThreadStart(run));
            t.Name = "zi";
            t.Start();
           





以上的代码就是网上盛传的 通过委托加invoke 来子线程操作的

虽然通过表面上看确实是由 new Thread 的对象来start开始的

启动的是子线程 并且主窗体也能操作

但是我觉得他只是做了 个转换或者是别的 反正不是单纯的子线程来操作 

因为即使用了invoke 执行程序的时候 界面同样被挂住

如果不信的话 把这句

  for (long i = 1; i <= 90000000; i++)
  {
  Console.WriteLine(i);
  }

中的write去掉 中间执行的时间大约5秒中 这5秒中窗体是不能点的

另外step1那个位置弹出的也不是zi 而是空 也就是主线程的名字


以上均为个人观点

------解决方案--------------------
不是子线程,仍然是同一个线程,不论是Invoke还是BeginInvoke
Invoke要等待返回结果才能执行,而BeginInvoke则直接调用完方法继续执行
------解决方案--------------------
Control.Invoke含义是将方法委托给拥有该Control的线程去执行.所以你程序2的委托dt是在当前窗体的线程上运行的.

建议看看这个:http://www.cnblogs.com/yencain/articles/1375616.html