C# 多线程同步与异步的实现

摘要:
多线程的概念目前,大多数操作系统都支持多任务调度和处理,而多任务通常包括两类:多处理和多线程。2多线程同步和异步多线程可以同时在同一共享资源上运行。因此,线程将无法获得资源,或者资源将被损坏。异步是指将调用请求发送给被调用方,并且调用方没有等待其结果的返回以继续当前处理。异步机制可以由多个线程、中断、消息等实现。

1 多线程概念
目前多数操作系统支持多任务调度和处理, 多任务通常包括两大类: 多进程和多线程。进程是指在系统中正在运行的一个应用程序; 多线程是系统分配处理器时间资源的基本单元, 或者说线程是进程中的基本执行单元。对操作系统而言, 其调度单元是线程。一个进程至少包括一个线程, 称之为主线程。一个进程从主线程的执行开始进而创建一个或多个次线程, 就是所谓基于多线程的多任务。

2 多线程的同步与异步
多个线程可能在同一时间对同一共享资源进行操作, 其结果是某个线程将无法获得资源, 或者会导致资源破坏。为保证共享资源的稳定性, 必须采用线程的同步机制。用“锁”来调整多个线程的操作顺序, 一旦某个线程获得“锁”控制权, 可保证只有它才能对共享资源进行操作。同样, 利用这个锁, 某个线程可一直处于等待状态, 直到有能够唤醒信号通过的变量传来为止。

异步是当一个调用请求发送给被调用者, 而调用者不用等待其结果的返回而继续当前的处理, 实现异步机制的方式有多线程、中断、消息等。异步操作在主应用程序线程以外的线程中执行, 应用程序调用方法异步执行某个操作时, 应用程序仍然可继续执行当前程序。异步操作一般用于执行完成时间较长的任务。

多线程由于有可能对同一共享资源进行访问, 为了协调对共享资源的操作, 需要采用线程同步解决这个问题, 目前有4种线程同步访问共享资源的方式: 一是使用System.Threading.Monitor 类型; 二是C# 语言的Lock关键字, 实际上,C# Lock关键字的底层是使用 Monitor 类实现的; 三是使用System.Threading.Interlocked 类型进行原子型操作; 四是使用[Synchronization]同步化原语。

线程异步编程, 不要忘了委托delegate、BeginInvoke, EndInvoke, AsyncCallBack 委托,AsyncState 实例( 在回调函数中通过IAsyncResult1AsyncState来强制转换), IAsycResult(监控异步), 这样就基本理解异步编程真谛了。异步操作通常用于执行完成时间可能较长的任务, 如打开大文件、连接远程计算机或查询数据库。但应注意, 滥用异步, 会影响性能, 而且增加编程难度, 故应慎重考虑。

免责声明:文章转载自《C# 多线程同步与异步的实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇面试 07-安全问题:CSRF和XSS关于鼠标移动事件晃动问题解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# 线程的几种实现方式

1.匿名线程实时监控,随便写在一个方法内就可以了 new Thread(() => { while (implement) { try {...

QT5 Thread线程

QT5 Thread线程继承QThread方式 一.首先分析一下 QTimer Class与 Sleep()函数之间的秘密 QTimer *t = new QTimer(*parent); //创建QTimer 对象 t->start(_time); //计时开始每隔_time时间自动触发&QTimer::timeout信号 t->st...

Jmeter属性和变量

一、Jmeter中的属性: 1、JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性 2、JMeter属性在测试脚本的任何地方都是可见的(全局),通常被用来定义一些JMeter使用的默认值,可以用于在线程间传递信息。 3、JMeter属性可以在测试计划中通过函数 _P 进行引用,但是不能作为特定线程的变量值...

iOS-消息循环RunLoop详解

RunLoop,跑圈。在iOS开发中,也就是运行循环。 在应用需要的时候自己跑起来运行,在用户没有操作的时候就停下来休息。充分节省CPU资源,提高程序性能。 二. RunLoop的概念与作用 概念:一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。但是有时候我们需要线程能够一直“待命”随时处理事件而不退出,这就需要一个机制来完成这样的...

多进程、协程、事件驱动及select poll epoll

目录 -多线程使用场景 -多进程  --简单的一个多进程例子  --进程间数据的交互实现方法    ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享    ---Queues     ---Pipe     ---通过Manager可以不同进程间实现数据的共享  --进程同步,即进程锁  --进程池 -协程  --先用yie...

第45章:TLS回调函数

TLS(Thread Local Storage,线程局部存储)回调函数(Callback Function)常用于反调试。 TLS 回调函数的调用运行要先于 EP 代码的执行。它是各线程独立的数据存储空间,可修改进程的全局/静态数据。 若在编程中启用了 TLS,PE 头文件中会设置 TLS 项目,即:IMAGE_TLS_Directory 其中比较重要...