C#的ThreadStart 和 Thread

多线程,new Thread(t1);和new Thread(new ThreadStart(t1));有什么区别

没有区别。
前者,是c#的语法。也就是说是编译器帮你改写为第二种形式。
因此你要搞清楚,这是.net的特性还是c#的特性。这是c#得特性,如果有人以为第一种写法“是.net的”那他就错了。

.net中根本不支持 new Thread(t1); 这种代码,这是c#编译器支持的。类似的东西也有很多。所以说c#比较优雅,是指这个部分。

要分清楚“什么是c#的,什么是.net的”,你能更好地理解c#,也能更好地理解.net。

 

在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用C# 
Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。

 

你要搞清楚ThreadStart是一个委托。虽然它叫Thread,但是它其实是一个普普通通的委托类型。
就好比
button.Click += button1_Click;

button1.Click += new EventHandler(button1_Click);

 

打开你的VS.net,新建一个控制台应用程序(Console Application),编写完全控制一个线程的代码示例:

 

using System;  

using System.Threading;   

 

namespace ThreadTest  

{  

public class Alpha  

{  

public void Beta()  

{  

while (true)  

{  

Console.WriteLine("Alpha.Beta is running in its own thread.");  

}  

}  

};   

 

public class Simple  

{  

public static int Main()  

{  

Console.WriteLine("Thread Start/Stop/Join Sample");  

Alpha oAlpha = new Alpha();  

//这里创建一个线程,使之执行Alpha类的Beta()方法  

Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));  

oThread.Start();  

while (!oThread.IsAlive)  

Thread.Sleep(1);  

oThread.Abort();  

oThread.Join();  

Console.WriteLine();  

Console.WriteLine("Alpha.Beta has finished");   

try   

{  

Console.WriteLine("Try to restart the Alpha.Beta thread");  

oThread.Start();  

}  

catch (ThreadStateException)   

{  

Console.Write("ThreadStateException trying to restart Alpha.Beta. ");  

Console.WriteLine("Expected since aborted threads cannot be restarted.");  

Console.ReadLine();  

}  

return 0;  

}  

}  

这段程序包含两个类Alpha和Simple,在创建线程oThread时我们用指向Alpha.Beta()方法的初始化了 ThreadStart代理(delegate)对象,当我们创建的线程oThread调用C# Thread.Start()方法启动时,实际上程序运行的是Alpha.Beta()方法:

  1. Alpha oAlpha = new Alpha();  
  2. Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));  
  3. oThread.Start();  

然后在Main()函数的while循环中,我们使用静态方法Thread.Sleep()让主线程停了1ms,这段时间CPU转向执行线程 oThread。然后我们试图调用Thread.Abort()方法终止线程oThread,注意后面的 oThread.Join(),Thread.Join()方法使主线程等待,直到oThread线程结束。你可以给Thread.Join()方法指定一个int型的参数作为等待的最长时间。之后,我们试图用C# Thread.Start()方法重新启动线程oThread,但是显然Abort()方法带来的后果是不可恢复的终止线程,所以最后程序会抛出 ThreadStateException异常。

posted on 2018-10-23 00:12  asdyzh  阅读(581)  评论(0编辑  收藏  举报

导航