C#的ThreadStart 和 Thread

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

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

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

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

 

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

 

你要搞清楚ThreadStart是一个委托。虽然它叫Thread,可是它实际上是一个普普统统的委托类型。
就比如
button.Click += button1_Click;

button1.Click += new EventHandler(button1_Click);.net

 

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

 

using System;  代理

using System.Threading;   指针

 

namespace ThreadTest  rest

{  对象

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异常。

相关文章
相关标签/搜索