新建的子线程可以是前台线程或者后台线程,前台线程必须全部执行完,即使主线程关闭掉,这时进程仍然存活。后台线程在未执行完成时,如果前台线程关掉,则后台线程也会停掉,且不抛出异常。也就是说,前台线程与后台线程唯一的区别是后台线程不会阻止进程终止。可以在任何时候将前台线程修改为后台线程。
在C#中,Thread类默认创建的是前台线程,通过线程池(后面会讲到)创建的线程都是后台线程。
一定要注意的是比如说一个控制台程序,如下
static void Main(string[] args) { //后台线程不阻止主线程的关闭 Thread th = new Thread(delegate() { Thread.Sleep(6000); //创建一个测试文件夹 Directory.CreateDirectory(@"D:TESTS测试"); }); th.IsBackground = true; th.Start(); Console.WriteLine("main thread end"); }
这时候是创建不了的,因为6秒还没过,Main方法就走完了,线程th是后台线程,无法阻止主线程这个前台线程,所以导致整个进程关闭了,自然子线程的方法就执行不了了。一定要注意在控制台中是这样的,因为走完Main方法控制台程序自然就关闭了,整个进程自动终止了。如果是MVC,winform这样的话走完Main整个程序是不会自动关闭的,th这个后台线程在等待6秒后是会接着执行的。一定不要弄混了。如果th设置成前台线程,只有子线程th执行完毕之后整个控制台程序才会关闭。