`

线程与异步的应用

 
阅读更多

 

  1. 一般会涉及的关键词:同步Invoke(delegate),InvokeRequired(InvokeRequired的职责是判断当前运行的线程是不是与窗体主线程是同一个线程。),异步IAsyncResult=delegate.beginInvoke(,,AsyncCallback(回调方法),),IsCompleted,
  2. 线程是系统资源调度的基本单元,一个进程至少有一个线程。
  3. 线程的同步是指对某一个资源共享时,该资源就被锁住了,某时间内只能为某一线程使用,其他线程只能等待。异步则可以在新开的线程中继续执行操作。
  4. 多线程同步中使用Lock:lock的作用是在多线程中才有存在价值,lock住的某段代码只有当前进入的线程执行完后才能给其他线程进入,lock的对象可以是任何引用类型的对象。像是atm取钱就可以作为线程同步的例子,当在取钱时lock住的话,就可以确保该账户的信息不会被其他用户更改。
  5. 多线程的异步调用中使用的BeginInvoke:在BeginInvoke的传人参数中有一个AsyncCallback,该AsyncCallback的参数是回调的方法名,执行Test.beginInvoke(Test是一个delegate)首先是先执行delegate委托方法,执行完成后,就会进入回调的方法,传人回调方法的参数是IAsyncResult,他是AsyncResult的一个实例,所以拿到这个IAsyncResult后要强制转化为AsyncResult类型,在AsyncResult对象中有一个AsyncDelegate的属性,能把他强制转化为之前那个delegate(就是Test)的对象,拿到转化后的test的对象后,才可以执行test.EndInvoke,从而拿到Test这个delegate的委托方法的运算结果。
  6. 异步是目的,多线程是实习这个目的方法;多线程和异步都能起到解除阻塞的目的,提高软件的可响应性。异步用到的就是多线程的技术,比如delegate的begininvoke就是是用了新的线程。但不能说异步就是多线程,用消息机制也可以实现异步;多线程能制造异步的效果,但不能说多线程就是异步。在写异步的代码时比如begininvoke,内部的机制用到的其实就是.net封装好的多线程技术。
  7. 实现异步的方式有很多,比如常见的创建一个后台线程,将任务委托给这个线程执行,但这种类型的异步并不是所有的都是高效的。创建高可伸缩性的应用的秘诀就是创建更少的线程干更多的活儿,我们目标是没有阻塞。要达到这一点在做一个应用之前我们应该先问自己:我的应用是计算密集型的还是IO密集型的。

    对于计算密集型,CPU是主要资源。那什么类型的应用是计算密集型的,比如解方程,排序,压缩,图形图像处理等。对于这类应用无论怎样你都必须占用CPU时间,所以你可以通过创建后台线程的方式来实现异步。

    对于IO密集型,IO是主要瓶颈。IO不仅仅是我们常说的读取磁盘文件,像数据库操作、FTP、HTTP等一切网络通信,磁盘访问等都属于IO。当我们进行IO操作时,我们实际上是不需要占用CPU的,比如磁盘访问,一般现代的磁盘驱动器都有自己的控制系统,它自己能够控制寻道等,就相当于磁盘自己有一个小CPU在工作,而我们机器的CPU这个时候就可以解放出来(不用等待,可以干其他的活儿),是不占用的。那么这个时候如果我们能使用异步IO(发起异步IO然后立即返回,当异步IO执行完毕后会通知你)将会对我们的应用的效率带来革命性的影响,因为IO相对于CPU来说是非常非常非常慢速的设备,我们甚至只需要很少的线程就可以处理很多的任务。

  8. 1
  9. 1
  10. 1
  11. 1
  12. 1
  13. 1
  14. 1
  15. 1
  16. 1
  17. 1
  18. 1
  19. 1
  20. 1
  21. 1
分享到:
评论

相关推荐

    concurrentunit, 用于测试多线程和异步应用程序的工具包.zip

    concurrentunit, 用于测试多线程和异步应用程序的工具包 ConcurrentUnit 一个简单的。零依赖的测试多线程。 支持 Java 1.6 。简介创建ConcurrentUnit是为了帮助开发人员测试多线程或者异步代码。 它允许你在任何线程...

    使用python多线程异步提高模型部署到rk3588NPU使用率-python源码+项目使用说明.zip

    使用python多线程异步提高模型部署到rk3588NPU使用率_python源码+项目使用说明.zip 【项目资源说明】 使用多线程异步操作rknn模型, 提高rk3588/rk3588s的NPU使用率, 进而提高推理帧数(rk3568之类修改后应该也能使用,...

    C#写的聊天软件,传统意义上的单线程异步模式

    这段代码跟我前面发的代码都是一个人写的,采用的就是传统意义上的单线程异步通讯模式,涉及到窗体的运用,有托盘图标的闪烁等等。代码不长,挺简单,只有两个form和一个公用类,相信想做关于C#窗体应用程序开发的...

    C# 多线程异步执行

    使用委托事件模拟多线程下载网络图片,即同时发送多个网络请求下载图片。 也可应用于其他异步多线程执行事件。

    基于多线程异步操作rknn模型对Yolov5进行推理Python源码+文档说明.zip

    使用多线程异步操作rknn模型, 提高rk3588/rk3588s的NPU使用率, 进而提高推理帧数,不过实际在使用摄像头做实时目标检测的时候帧率在25左右,所以后面打算主要使用rknpu2做板端部署,预计会快很多,有待验证 ...

    vc++ 线程同步与异步套接字编程实例

    vc++ 线程同步与异步套接字编程实例,Windows套接字在两种模式下执行I/O操作,阻塞和非阻塞。在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回程序(将控制权交还给程序)。而在非...

    C#多线程,线程同步 异步 学习

    C#多线程学习资料,里面有关于C#多线程的介绍,包括线程的同步异步操作,代码锁,对象所,另外还介绍了ThreadPool的应用,是比较全面的多线程学习资料。

    C#基于异步事件回调多线程容器

    如果应用不复杂,可以采用DB做个简单的消息中心,建议采用HTTP接口来获取与写入消息,方便将来升级重构消息中心。 开发环境VS2012,Framework4.0,代码注释量很大,如果你高兴这代码你可以随意蹂躏,如果你有建设性...

    winform 多线程 异步 文件操作(查询、删除) 实例 代码 textbox ComboBox label C#

    winform 窗体应用程序 实现异步操作 多线程 对系统文件查询 和 删除 winform 多线程 异步 文件操作(查询、删除) 实例 代码 textbox ComboBox label c#

    C#多线程编程实战 源代码

    在计算机处理器发展为包含越来越多的核心的时期,多线程是创建可伸缩性、高效的、高响应性应用程序的关键因素。如果你没有正确地使用多线程,它会导致难以捉摸的问题,需要你花费大量时间去解决。因此,现代应用程序...

    基于Qt的多线程流水线异步服务器稳定版

    (上一个版本“一种可伸缩的全异步C/S架构服务器实现”是有问题的,现在已经完成更改)。 服务由以下几个模块组成. 1、 网络传输模块。负责管理用于监听、传输的套接字,并控制数据流在不同线程中流动。数据收发由一定...

    多线程异步加载图片代码

    实现图片异步加载的代码库, 使用用多线程方式 , 并且可以把图片缓存到 内存或本地文件系统 SD卡上,可配置 下载线程数,缓存位置, 缓存大小,图片显示方式等, 可用于 listview, gridview, pageview中, 而且可以监听 ...

    delphi多线程同步对象及异步执行监视CPU.zip

    本文及其示例代码,诠释System.Classes.pas中的(多)线程 和System.SyncObjs.pas (深入应用(多)线程时涉及的同步对象),System.Threading.pas线程、线程池、未来、任务及并行库的原理与应用。期待对各位同学和...

    Socket异步通信,线程,双端队列

    Socket异步通信,线程,双端队列1.正确的开始和终止线程; 2.可以局域网内多人聊天; 3.双端队列的设计和应用

    可扩展多线程异步Socket服务器框架EMTASS 2.0

    在程序设计与实际应用中,Socket数据包接收服务器够得上一个经典问题了:需要计算机与网络编程知识(主要是Socket),与业务处理逻辑密切(如:包组成规则),同时还要兼顾系统运行的稳定、效率、安全与管理等。...

    一个分布式爬虫框架 一行代码开发一个分布式爬虫,拥有"多线程、异步、IP动态代理、分布式、JS渲染"等特性

    一个分布式爬虫框架。一行代码开发一个分布式爬虫,拥有"多线程、异步、IP动态代理、分布式、JS渲染"等特性;

    用PB编写多线程应用程序

    多线程是指一个程序内部同时执行的多个流程,与单线程相比,它至少有两个方面的优点:第一,它可以更好地利用系统资源,比如CPU,若一个线程因I/O操作受阻,另一个线程仍可利用CPU来执行;第二,它更好地满足了客户...

    多线程简单应用测试C#源代码

    多线程允许你同时执行多个代码路径,这可以帮助你的应用程序同时处理多个任务,提高程序的运行效率。在 C# 中,使用 System.Threading 命名空间来创建和管理多线程。 1.线程池 (Thread Pool): 线程池是用于执行异步...

    Asp.net同异步线程实例

    此实例主要用于Asp.net同步和异步编程以及客户对象的应用. 此实例主要起抛砖引玉的作用.此实例为动态产生随机号并实时显示出来.

Global site tag (gtag.js) - Google Analytics