C#中的线程

1.线程Thread

多线程的意义在于一个应用程序中,有多个执行部分可以同时执行;对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程就不会阻塞,可以继续往下执行;等到后台线程执行完毕,再通知主线程,然后做出对应操作!

启动Thread线程

 1         static void Main(string[] args)
 2         {
 3             // 启动多线程
 4             Thread thread = new Thread(myThreadDemo);
 5             thread.IsBackground = true;
 6             thread.Start();
 7 
 8             for (int i = 0; i < 10; i++) // 主线程
 9             {
10                 Console.WriteLine("main is working...");    
11             }
12             thread.Join();
13         }
14         
15         static void myThreadDemo()
16         {
17             Console.WriteLine("  >> now statr thread....");
18             Thread.Sleep(1000);
19             Console.WriteLine("  >> thread is over..");
20         }

执行结果如图:

Thread thread = new Thread(myThreadDemo);启动无参无返回值ThreadStart线程,等同于 Thread thread = new Thread(myThreadDemo);

启动带参数Thread线程

 1         static void Main(string[] args)
 2         {
 3             // 启动多线程
 4             Thread thread = new Thread(new ParameterizedThreadStart(myThreadDemo));
 5             thread.IsBackground = true;
 6             thread.Start("Ronaldo");
 7 
 8             for (int i = 0; i < 10; i++) // 主线程
 9             {
10                 Console.WriteLine("main is working...");    
11             }
12             thread.Join();
13         }
14 
15         static void myThreadDemo(object name)
16         {
17             Console.WriteLine(name.ToString());
18             Console.WriteLine("  >> now statr thread....");
19             Thread.Sleep(1000);
20             Console.WriteLine("  >> thread is over..");
21         }    

线程池

使用ThreadStart与ParameterizedThreadStart建立新线程非常简单,但通过此方法建立的线程难于管理,若建立过多的线程反而会影响系统的性能。

设想如果需要处理大量任务,例如网站后台对于HTTP请求的处理,那是不是要对每一个请求创建一个后台线程呢?显然这样对占用大量内存,而且频繁地创建的过程也会严重影响速度。为了应对这种情况,.net引入了线程池的概念。

线程池会把创建的线程保存起来,在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。这样既节省了建立线程所造成的性能损耗,也可以让多个任务反复重用同一线程,从而在应用程序生存期内节约大量开销。

下面做个试验

for (int i = 0; i < 10; i++)
{
    ThreadPool.QueueUserWorkItem(m =>
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
    });
}
Console.Read();

可以看到,虽然执行了10次,但并没有创建10个线程。

ThreadPool可以使用工作者线程和委托类创建线程。

 

Task

        static void Main(string[] args) 
        {
            //StartNew .NetFramework4.0
            Task t = Task.Factory.StartNew(() =>
            {
                // Just loop.
                int ctr = 0;
                for (ctr = 0; ctr <= 10000; ctr++)
                {
                    Thread.Sleep(1);
                }
                Console.WriteLine("Finished {0} loop iterations",
                                  ctr);
            });
            Console.WriteLine("go on");
            t.Wait();

            //StartNew .NetFramework4.5
            Task t2 = Task.Run(() =>
            {
                // Just loop.
                int ctr = 0;
                for (ctr = 0; ctr <= 10000; ctr++)
                {
                    Thread.Sleep(1);
                }
                Console.WriteLine("Finished {0} loop iterations",
                                  ctr);
            });
            Console.WriteLine("go on");
            //t2.Wait(); // 等待任务完成,再进行下次操作

            Task.WaitAll(); // 等待任一一个任务完成
            Console.WriteLine("where i am");
            Task.WaitAll(t2); // 等待t2任务完成
        }    
原文地址:https://www.cnblogs.com/LTEF/p/9145012.html