C#多线程

C#多线程

一、首先了解下基本概念

进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间的独立的,一个进程无法访问另一个进程的数据(当然不是一定的可以用分布式计算方式),一个进程运行失败也不会影响到其他进程的·运行,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。应用程序的一个运行例程,是应用的一次动态执行过程。

线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单元,一个进程可以包括若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。在.Net应用程序中,都是以Main()方法做为入口,当调用此方法时系统就会自动创建一个主线程。线程主要就是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。

 简单理解就是:

计算机概念:

进程:程序在服务器上运行时,暂据的计算资源的合集,称之为进程。

           进程之前不会相互干扰----就导致了进程之间的通讯比较困难(分布式)。

线程:程序执行的最小单位,响应操作的最小执行流,

           线程也包含自己的计算资源,

           线程是属于进程的,一个进程可以有多个线程。

多线程:一个进程里面,有多个线程并发执行。

C#:
多线程Thread:类,就是一个封装,是NetFramework对线程对象的抽象封装

                          通过Thread去完成的操作,最终是通过向操作系统请求得到的执行流

CurrentThread:当前线程--任何操作执行都是线程完成的,运行当前这句话的线程

ManagedThreadId:是.Net平台给Thread起的名字,就是个int值,尽量不重复

现在简单写多线程Thread的初步使用。

 Console.WriteLine($"在调用 button1_Click Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("HH:mm:ss:fff")}");
            {
                {
                    ThreadStart threadStart = () =>
                    {
                        this.DoSomethingLong("button1_Click");
                    };
                    Thread thread = new Thread(threadStart);
                    thread.Start(); //开启一个新线程                 
                    
                }
                
                {
                    ParameterizedThreadStart threadStart = ar =>
                    {
                        this.DoSomethingLong("button1_Click");
                    };
                    Thread thread = new Thread(threadStart);
                    thread.Start();
                    
                }
         
            }

  

 private void DoSomethingLong(string name)
        {
            Console.WriteLine($"在调用DoSomethingLong Start {name} {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("HH:mm:ss:fff")}");
            long lResult = 0;
            Thread.Sleep(2000);//线程等待
            Console.WriteLine($"在等待线程后********DoSomethingLong   End {name}" +
                $"{Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("HH:mm:ss:fff")} {lResult}");
        }

  

关于Thread还有

//thread.Abort);/终结线程其实是抛出一个异常都会有延时
//Thread.ResetAbortO;/是把终结的线程再次启用都会有延时
//thread.Priority=ThreadPriority.Highest:/是不是就可以保证是优先执行?设置高优先级,只是一个概率提升
//thread.IsBackground =true;//为后台线程进程结束,线程结束了
//thread.IsBackground=false;/前台线程进程结束后,任务执行完毕以后,线程才结束

//如果我们需要等待;
//1、等待
//while(thread.ThreadState!=ThreadState.Stopped)
//{
//Thread.Sleep(2000);
//}
//2、Join等待
//thread.Join();∥可以限时等待会阻塞,等待线程结束
//thread.Join(2000);∥可以限时等待,最多等待2000ms,超时以后就不等了

  

想在深入了解的可以去https://www.cnblogs.com/w6w6/p/10648921.html这位大佬那里看看

原文地址:https://www.cnblogs.com/mvpbest/p/13264305.html