- 一般会涉及的关键词:同步Invoke(delegate),InvokeRequired(InvokeRequired的职责是判断当前运行的线程是不是与窗体主线程是同一个线程。),异步IAsyncResult=delegate.beginInvoke(,,AsyncCallback(回调方法),),IsCompleted,
- 线程是系统资源调度的基本单元,一个进程至少有一个线程。
- 线程的同步是指对某一个资源共享时,该资源就被锁住了,某时间内只能为某一线程使用,其他线程只能等待。异步则可以在新开的线程中继续执行操作。
- 多线程同步中使用Lock:lock的作用是在多线程中才有存在价值,lock住的某段代码只有当前进入的线程执行完后才能给其他线程进入,lock的对象可以是任何引用类型的对象。像是atm取钱就可以作为线程同步的例子,当在取钱时lock住的话,就可以确保该账户的信息不会被其他用户更改。
- 多线程的异步调用中使用的BeginInvoke:在BeginInvoke的传人参数中有一个AsyncCallback,该AsyncCallback的参数是回调的方法名,执行Test.beginInvoke(Test是一个delegate)首先是先执行delegate委托方法,执行完成后,就会进入回调的方法,传人回调方法的参数是IAsyncResult,他是AsyncResult的一个实例,所以拿到这个IAsyncResult后要强制转化为AsyncResult类型,在AsyncResult对象中有一个AsyncDelegate的属性,能把他强制转化为之前那个delegate(就是Test)的对象,拿到转化后的test的对象后,才可以执行test.EndInvoke,从而拿到Test这个delegate的委托方法的运算结果。
- 异步是目的,多线程是实习这个目的方法;多线程和异步都能起到解除阻塞的目的,提高软件的可响应性。异步用到的就是多线程的技术,比如delegate的begininvoke就是是用了新的线程。但不能说异步就是多线程,用消息机制也可以实现异步;多线程能制造异步的效果,但不能说多线程就是异步。在写异步的代码时比如begininvoke,内部的机制用到的其实就是.net封装好的多线程技术。
-
实现异步的方式有很多,比如常见的创建一个后台线程,将任务委托给这个线程执行,但这种类型的异步并不是所有的都是高效的。创建高可伸缩性的应用的秘诀就是创建更少的线程干更多的活儿,我们目标是没有阻塞。要达到这一点在做一个应用之前我们应该先问自己:我的应用是计算密集型的还是IO密集型的。
对于计算密集型,CPU是主要资源。那什么类型的应用是计算密集型的,比如解方程,排序,压缩,图形图像处理等。对于这类应用无论怎样你都必须占用CPU时间,所以你可以通过创建后台线程的方式来实现异步。
对于IO密集型,IO是主要瓶颈。IO不仅仅是我们常说的读取磁盘文件,像数据库操作、FTP、HTTP等一切网络通信,磁盘访问等都属于IO。当我们进行IO操作时,我们实际上是不需要占用CPU的,比如磁盘访问,一般现代的磁盘驱动器都有自己的控制系统,它自己能够控制寻道等,就相当于磁盘自己有一个小CPU在工作,而我们机器的CPU这个时候就可以解放出来(不用等待,可以干其他的活儿),是不占用的。那么这个时候如果我们能使用异步IO(发起异步IO然后立即返回,当异步IO执行完毕后会通知你)将会对我们的应用的效率带来革命性的影响,因为IO相对于CPU来说是非常非常非常慢速的设备,我们甚至只需要很少的线程就可以处理很多的任务。
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1