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