进程和线程
进程:一个程序就是一个进程,它包含着运行程序所须要的全部的资源。进程之间是独立的,一个进程没法直接访问另外一个进程的数据。(除非使用分布式计算方式)html
一个进程运行失败也不会影响到其余进程的运行。进程能够理解为一个程序的基本边界。windows
process类封装了操做进程的方法多线程
线程:windows任务调度的最小单位。线程是程序中的一个代码流,代码必须执行在线程中,有线程才有代码执行并发
进程是一个资源的拥有着,进程的建立,撤销和切换的过程当中,系统都必须为之付出巨大的时空资源。分布式
前台线程与后台线程的区别:函数
后台线程在程序退出时退出,前台线程会在执行完代码以后退出。ui
Thread封装了操做线程的方法
this
建立线程 方法无参数版:spa
ThreadStart threadStart = new ThreadStart();//括号中写调用进程启动的方法 Threard myThread = new Thread(threadStart); //建立一个thread的实例 [myThread.Name="";] //线程名 [myThread.Prioryity=ThreadPriorytyNormal;]建议系统将建立的线程优先级设为最 高 [myThread.IsBackground=true;] //是否为后台线程, myThread.Start //告诉CPU线程能够启动了 myThread.Join(int) //阻塞主线程,等待子线程执行完毕。括号内等待毫秒。 [myThread.Abort();] // 强行终止线程,此方法会引起异常,暴力手段。
当不容许阻塞ui线程时,建立多线程。线程
方法有参数时
ParameterizedThreadStart parThreadStart = new ParameterizedThreadStart(方法名); Thread myThread = new Thread(parThreadStart); myThread.Start(方法参数);
既然没法跨线程访问数据,那么如何在程序猿手动建立的线程中访问form控件的值呢?
1.在页面的构造函数中写这么一串代码
控件.CheckForillegalCrossThreadCalls=false; //取消对某控件的跨线程访问监视
上面这种方法很low,微软会平白无故的封装一个监视控件跨线程吗?
2.使用Invork方法
invoke会沿着标签去找寻找建立控件的线程执行下面的方法,谁建立了textBox的线程,就用该线程调用该委托
this.textBox1.Invoke(委托[,参数]);
文件并发:
当多个资源访问同一个线程,须要加锁。lock(object a) {code b}
线程切换很是消耗资源,Cpu在切换线程时,须要把当前线程执行的状态保持到寄存器里去。
建立也很是消耗资源,线程建立很是慢,占用大量的内存空间,每一个线程里面最少1M内存开销。
线程池:提升了线程的利用率,很是适合工做任务很是小,并且又须要使用单独的线程来解决的问题。
关于线程池的更多信息。
http://www.cnblogs.com/heyuquan/archive/2012/12/23/threadPool-manager.html