首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

this.invoke(嘱托)启动的真是子线程吗

2012-08-27 
this.invoke(委托)启动的真是子线程吗做过几个试验不多说 看代码程序一:C# codefor (long i 1 i 900

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

热点排行