【C#多线程编程实战笔记】一、 线程基础

创建线程

Thread :所执行的方法不能有参数。

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程开始....");
            Thread t = new Thread( print_1);
            t.Start();
            
            print_2();
            Console.ReadLine();

        }

        static void print_1()
        {
            Console.WriteLine("线程开始...");
            string[] a = {"a","b","c","d","e","f","g"};

            for (int i = 0; i < 7; i++)
            {
               
                Console.WriteLine(a[i]);
            }
        }

        static void print_2()
        {
            Console.WriteLine("主线程调用方法...");
            for (int i = 0; i < 50; i++)
            {
                Console.WriteLine(i);
            }
        }
    }

ParameterizedThreadStart:可以接受一个输入参数

 static void Main(string[] args)
 {
      Thread ts = new Thread(new ParameterizedThreadStart(print_3));
      ts.Start("123");
      Console.ReadLine();
 }

 static void print_3(object a)
{
      Console.WriteLine($"输出{a}");
}

 暂停线程

使线程暂停一段时间而不消耗操作系统资源,程序输出之前,将休眠5秒钟,它会尽可能的少占用CPU时间。

 static void Main(string[] args)
        {
            Console.WriteLine("主线程开始....");
            Thread ts = new Thread(new ParameterizedThreadStart(print_3));
            ts.Start("123");

            Console.ReadLine();
        }

        static void print_3(object a)
        {
            Thread.Sleep(TimeSpan.FromSeconds(5));
            Console.WriteLine($"输出{a}");
        }

等待线程

让程序等待线程中的计算完成,并使用该线程的结果

        static void Main(string[] args)
        {
            Console.WriteLine("主线程开始....");
            Thread ts = new Thread(new ParameterizedThreadStart(print_3));
            ts.Start("123");
            ts.Join();
            Console.WriteLine("主线程继续运行....");
            Console.ReadLine();
        }

程序运行时,启动了一个耗时的线程。正常情况下,会先打印出  "主线程继续运行....",然后在输出线程中的文字,但我们在程序中调用了ts.Join()方法,该方法允许我们主线程等待线程ts运行完时,主程序再继续运行。借助这个方法可以实现两个线程同步执行步骤,第一个线程会等待另一个线程的结果在继续执行,这时候,第一个线程等待时处于阻塞状态。

线程状态

ts.ThreadState.ToString()

Thread.CurrentThread.ThreadState.ToString()

ps:始终可以通过Thread.CurrentThread静态属性获得当前Thread对象

向线程传递参数

两种:

var t1 = new Thread(TestCounter),其中TestCounter方法必须是obejct类型的单个参数

var t2 =new Thread(()=>TestCounter2(12)),使用lambda表达式

posted @ 2017-08-17 23:24  【可乐不加冰】  阅读(207)  评论(0编辑  收藏  举报