最近自己总结了多线程的概念,网上VB.net原码非常少,大部分都是C#的。希望在这里和有兴趣的朋友一起分享,有错误的地方希望大家能指出,以下均为原创.
对于已经习惯用多线程编写程序的朋友来说这些概念应该是不陌生的,在这里我首先先强调下基础概念。
一.基础概念
1. 首先操作系统是多任务系统,系统把不同的程序任务安排在不同的系统内存上,每个内存互相独立,存放着资源代码,并且不能互相干扰,这样一个内存区域就是进程,一个进程内至少有一个前台线程,否则进程就会被销毁释放。
2.线程可以理解成一个代码执行流,一般来说一个程序总存在一个主线程,前台线程和后台线程本质区别在于前台线程的生命周期是整个进程的生命周期,如果前台哪怕只有一个线程还在执行,系统都不会撤消进程,会把最后一个前台线程执行完毕后才会销毁。可是后台线程在前台进程释放完后会立即销毁,进程不会为后台线程保留。
3.使用线程的好处,主要是2个方面,大家知道如果在UI线程执行一个死循环或者耗时非常长的程序,UI会非常卡,如果把这些程序放到别的线程,会得到一个非常好的UI体验。另外的作用就是可以并行处理任务,使复杂任务可以多元化处理。
4.线程同步的概念,可以这么说单线程绝对是同步的,因为在一个线程上调用一个方法,程序的控制权会暂时交给该方法,等方法执行完毕后返回,代码才能从调用方法那里继续执行。可是,多线程同步的概念是当一个线程在执行时候,其他线程会被暂时阻塞,当多个线程同时访问一快内存时候,可能会出现不可预料的问题,所以多线程的同步有时候难以避免,这些后面我会举例。
5线程异步概念 ,异步是相对同步而言的,当一个线程里开启另外一个线程时候,这时候调用线程发出请求之后不会等待,立刻返回,继续执行其他任务。
二.多线程开启手段
首先我们必须要了解线程池的概念,大家知道线程是属于系统管理级别的资源,非常昂贵,如果我们随意创建线程,不充分利用的话会损失系统性能,所以.net帮我们做好了一切,.net系统为每个程序进程提供一个线程池,在线程池中系统会自动的判断异步请求的数目来自己自动创建线程,把超时不用的空闲线程自动销毁,为我们编写异步多线程程序带了极大的方便,顺便说下线程池的线程默认都是后台的。
下面我简单介绍下系统线程池的使用方法。
1.通过控件Backgroudworker控件来实现,这个空间使用也是很方便的,他实现了一个后台运行的SUB dowork,这里编写你的后台执行任务,关于该控件的用法,由于篇幅问题不做详细说明,非常简单,但是使用起来不是特别方便。
2.通过System.Timers.Timer和System.Threading.Timer来实现,只是WindowsForm里的定时器是UI线程上执行的,所以不属于异步范畴。
3.通过委托Delegate和System.Threading.ThreadPool.QueueUserWorkItem()静态共享方法来实现,这里2个方法本质是差不多,我这里把委托拿出来重点来说。
delegate是.net里面的定义方法指针的强类型,很多底成功能都要通过委托来完成,这里主要利用委托来进行多线程的演示,首先创建如图界面。
这里2个按钮分别启动2个线程来执行一段烦琐的循环程序,并定期向UI的progressbar控件提供进度信息,最后更新listbox窗口的数据。
为了防止共享数据的干扰,屏除不必要的同步,这里先创建一个Class Sender,该类写在Class form1中,定为私有类即可,代码非常简单,只是存储几个数据
先不要占楼,谢谢
对于已经习惯用多线程编写程序的朋友来说这些概念应该是不陌生的,在这里我首先先强调下基础概念。
一.基础概念
1. 首先操作系统是多任务系统,系统把不同的程序任务安排在不同的系统内存上,每个内存互相独立,存放着资源代码,并且不能互相干扰,这样一个内存区域就是进程,一个进程内至少有一个前台线程,否则进程就会被销毁释放。
2.线程可以理解成一个代码执行流,一般来说一个程序总存在一个主线程,前台线程和后台线程本质区别在于前台线程的生命周期是整个进程的生命周期,如果前台哪怕只有一个线程还在执行,系统都不会撤消进程,会把最后一个前台线程执行完毕后才会销毁。可是后台线程在前台进程释放完后会立即销毁,进程不会为后台线程保留。
3.使用线程的好处,主要是2个方面,大家知道如果在UI线程执行一个死循环或者耗时非常长的程序,UI会非常卡,如果把这些程序放到别的线程,会得到一个非常好的UI体验。另外的作用就是可以并行处理任务,使复杂任务可以多元化处理。
4.线程同步的概念,可以这么说单线程绝对是同步的,因为在一个线程上调用一个方法,程序的控制权会暂时交给该方法,等方法执行完毕后返回,代码才能从调用方法那里继续执行。可是,多线程同步的概念是当一个线程在执行时候,其他线程会被暂时阻塞,当多个线程同时访问一快内存时候,可能会出现不可预料的问题,所以多线程的同步有时候难以避免,这些后面我会举例。
5线程异步概念 ,异步是相对同步而言的,当一个线程里开启另外一个线程时候,这时候调用线程发出请求之后不会等待,立刻返回,继续执行其他任务。
二.多线程开启手段
首先我们必须要了解线程池的概念,大家知道线程是属于系统管理级别的资源,非常昂贵,如果我们随意创建线程,不充分利用的话会损失系统性能,所以.net帮我们做好了一切,.net系统为每个程序进程提供一个线程池,在线程池中系统会自动的判断异步请求的数目来自己自动创建线程,把超时不用的空闲线程自动销毁,为我们编写异步多线程程序带了极大的方便,顺便说下线程池的线程默认都是后台的。
下面我简单介绍下系统线程池的使用方法。
1.通过控件Backgroudworker控件来实现,这个空间使用也是很方便的,他实现了一个后台运行的SUB dowork,这里编写你的后台执行任务,关于该控件的用法,由于篇幅问题不做详细说明,非常简单,但是使用起来不是特别方便。
2.通过System.Timers.Timer和System.Threading.Timer来实现,只是WindowsForm里的定时器是UI线程上执行的,所以不属于异步范畴。
3.通过委托Delegate和System.Threading.ThreadPool.QueueUserWorkItem()静态共享方法来实现,这里2个方法本质是差不多,我这里把委托拿出来重点来说。
delegate是.net里面的定义方法指针的强类型,很多底成功能都要通过委托来完成,这里主要利用委托来进行多线程的演示,首先创建如图界面。
这里2个按钮分别启动2个线程来执行一段烦琐的循环程序,并定期向UI的progressbar控件提供进度信息,最后更新listbox窗口的数据。
为了防止共享数据的干扰,屏除不必要的同步,这里先创建一个Class Sender,该类写在Class form1中,定为私有类即可,代码非常简单,只是存储几个数据
先不要占楼,谢谢