VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之线程基础

认识线程

复制代码
public static void Print()
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(1000);
                Console.WriteLine(i);
            }
        }
        public static void Print1()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("i am first thread " + i);
            }
        }
复制代码
复制代码
 Console.WriteLine("Starting------------");

            Thread t = new Thread(Print);
            t.Start();
           
            Print1();

            Console.ReadKey();
复制代码

因为新启动的线程里会休息一下,所以肯定是主线程的方法先执行,

 

如果想让新启动的线程执行完再去执行主线,也就是让主线程等待,可以用 join

复制代码
 Console.WriteLine("Starting------------");

            Thread t = new Thread(Print);
            t.Start();
            t.Join();  //阻塞后面的线程,一直等到它完成。
            Print1();

            Console.ReadKey();
复制代码

 

有时候觉得新启动的线程有点不听话,干脆干掉吧,让它活一会已经够意思了,可以用Abort,但是这个容易出问题,不建议使用。

复制代码
  Console.WriteLine("Starting------------");

            Thread t = new Thread(Print);
            t.Start();
            Thread.Sleep(5000);
            t.Abort();//干掉线程,容易引发异常,不建议使用
            Print1();

            Console.ReadKey();
复制代码

 

线程是有前后之分的,默认显示创建的线程都是前台线程,而进程会等待所有的前台线程结束后自动关闭程序,不管后台线程的死活,不过如果程序定义了一个永远不会执行完的线程那么就可以等待后台线程执行完了,比如 Console.ReadKey(),是吧,哈哈

复制代码
 Console.WriteLine("Starting------------");

            Thread t = new Thread(Print);
            t.Start();
            t.IsBackground = true;
            Print1();

            //Console.ReadKey();
复制代码

 

把新启动的线程设置为后台线程之后,如果最后一下不注释的话,那么前后线程都会执行完,如果注释的话,那么主线程执行完直接就结束程序了。

 

 

如果调用的方法里想传递参数呢,不用着急有2中方法。

1、

复制代码
 public static void Print3(string name)
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(name + "========================" + i);
            }
        }
复制代码
 Console.WriteLine("Starting------------");
            Thread t = new Thread(() => { Print3("i am"); });
            t.Start();            
            Console.ReadKey();

 

2、

复制代码
 public static void Print4(object name)
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(name + "========================" + i);
            }
        }
复制代码
 Console.WriteLine("Starting------------");
            Thread t = new Thread(new ParameterizedThreadStart(Print4));
            t.Start("i am ");            
            Console.ReadKey();

注意2中带参数的方式,第二种比较特殊,要求方法参数必须是object的,要注意。

 

异常处理的话,一般是在线程里进行try-catch,如果是在线程外面 try-catch的话,将失效,即 报错。


相关教程