线程基础使用
c#利用Thread类创建一个线程,这个类接受一个委托作为参数,可以是ThreadStart或者ParameterizedThreadStart,然后调用Start方法开始执行线程。ThreadStart跟ParameterizedThreadStart的区别在于,前者不接受参数,后者接受参数。
创建一个控制台程序,利用ThreadStart委托创建一个线程:
using System.Threading;
public static void CallToChildThread()
{
Console.WriteLine("子线程1");
}
static void Main(string[] args)
{
Console.WriteLine("创建一个线程");
Thread childThread = new Thread(new ThreadStart(CallToChildThread));
childThread.Start();
Console.ReadLine();
}
下面利用ParameterizedThreadStart创建一个线程,并接受参数:
public static void CallToChildThread(object value)
{
Console.WriteLine(value);
}
static void Main(string[] args)
{
Console.WriteLine("创建一个线程");
Thread childThread = new Thread(new ParameterizedThreadStart(CallToChildThread));
childThread.Start("hzkzb");
Console.ReadLine();
}
注意一点,方法接受的参数类型必须为object,否侧会报错。
实际使用中可以省略ThreadStart跟ParameterizedThreadStart直接传入方法名,编译的时候会自动进行匹配。
前台线程与后台线程
- 前台线程:所有前台线程执行完毕后,应用程序才能关闭;
- 后台线程:哪怕后台线程正在执行,应用程序也能强行关闭。
用IsBackground属性设置线程是否后台线程,默认是flase。
创建一个控制台程序
public static void CallToChildThread()
{
Console.WriteLine("子线程1");
Thread.Sleep(5000);//使线程暂停五秒
Console.WriteLine("子线程2");
}
static void Main(string[] args)
{
Console.WriteLine("创建一个线程");
Thread childThread = new Thread(CallToChildThread);
childThread.Start();
childThread.IsBackground = true;
}
当childThread.IsBackground = true;的时候,主程序在childThread 子线程还没执行完就立刻关闭了程序,由于是个控制台程序所以一闪而过,此时childThread 是个后台线程。
把childThread.IsBackground = true;注释掉,此时childThread 是个前台线程,这个时候childThread 子线程执行完,主程序才能关闭。