解析VS.Net线程同步和异步调用

有不少读者可能对"同步"和"异步"的概念以及回调函数等等术语还有些疑惑。这里就举个简单的例子说明一下。 比方说,你早上到了办公室,去打开水,打回水后然后沏茶。你同步调用打开水和沏茶两个函数。打开水完成后才可能沏茶。沏茶完成后你才可以看文件或是做其它工作。如果茶炉房出了些问题或者是人很多,那么你就要等着,直到打到了开水,你才可以回来干其它事情。在茶炉房等待开水的时候你什么也不能干。这种情况叫做被阻拦(Block)。准确的说就是执行函数的线程被阻拦。 要避免这种情况,你可以到达办公室后,说“王秘书,给我打壶开水去”。说完后你就可以开始看文件,做其他事了。等一会儿后,王秘书回来了,你就可以沏茶了。叫王秘书打开水就意味着你异步调用打开水这个函数。你不再担心在茶炉房等开水,你吩咐完王秘书后,你没有被阻拦,你可以马上开始做其它事情。但是开水总是要有个人去打,在这里王秘书是真正完成打开水函数的人。用计算机术语来将,王秘书可以是一个进程(Process)或是一个线程(Thread)。从理论上将,进程和线程都可以完成打开水这件事,但是就这类问题而言,使用进程是非常"昂贵"的,并且新的进程和原进程的通讯要复杂和慢的多,所以通常情况下,王秘书将会是一个线程。 如果你对王秘书说"王秘书,给我打开水。打回来后给我沏杯茶"。这种情况下,沏茶就是一个回调函数。沏茶将由王秘书这个"线程"来执行,在完成了打开水之后。 看起来很COOL是吧。有个"王秘书"使唤方便多了。但是别忘了王秘书出现后会有些其它问题。比如王秘书打回开水后给你沏茶时,你正用着茶几。她和你没有协调好撞在了一起,并把开水倒到了你的裤子上。因为办公室有和两个人,就出现了相互协调的问题。用计算机术语讲就是"多线程同步Multi-Thread Synchronization"。在计算机世界里,多个线程如何协调,同步是一个并不简单的问题。搞不好回造成信息紊乱,程序死锁。 让我们把这个问题想的再深一层。王秘书如果打开水的时候出了事打不回开水怎么办?你可能在开始的时候回对她说,"要是半个小时打不到水就算了"。这样就要求王秘书有时间概念。从计算机上讲,就是Timeout的机制。如果王秘书半个小时后没有回来,你可能想派刘秘书再去打。但是王秘书还拿着水壶呢(占着资源hold resources),这可怎么办?如果一切顺利,王秘书打完开水,沏完茶后该如何处理呢?是让她"走人"呢还是留着呢?因为你可能一会儿还会有拿报纸,寄邮件等等杂事。留着她也许还有用。可是王秘书会办其它事吗?如果不行的话,你可能还要用刘秘书,赵秘书等等来干每一项具体工作。另外公司里可能不止你一个"头头",孙总,李CEO,马董事长也需要人"侍候"。这时候成立一个"秘书处"可能比每人配备一堆秘书更经济更有效。因为使用秘书是要有代价的(线程的生成,释放,同步是要占用计算机CPU时间和内存等资源的)。这个"秘书处"在计算机里的对应物就是线程池(Thread Pool)。这是当今开发服务器端程序普遍采用的一个技术,目的是最大可能的提高程序性能,优化资源配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值