1. 如何写一个“异步函数” 我们平常编程写的函数 几乎都是同步调用函数,那么我们如何写一个异步执行的函数呢?!我想这个问题也许是哪些比较喜欢专研的程序员或者具有专研精神的人士回提出的问题吧!我们很多人已经习惯了windows系统提供的一些异步机制,使用这些异步机制我们很快的就能实现一些异步操作甚至可以很容易的实现一个异步执行的函数;但是我们研究过实现一个“异步函数”的本质吗?!
在单线程的系统中,所以的指令执行都是顺序执行的,这就暗示了如果一个函数A中调用了函数B,则A必须等到B执行后才能继续执行A中剩下的代码 。
在多线程中,如果我们有一个threadA线程,在该线程中调用了一个函数C,而该C函数我们想将它实现成异步执行的,而异步执行必须要有多线程支持;如果我们在Windows中编写程序,创建一个线程是很简单只要使用
HANDLE WINAPI CreateThread(
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
【异步怎么写】__in_opt LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId);
函数就可以创建一个线程 。
那么我们按如下方式可以实现一个异步的FuncC函数:
(1)先把你要异步完成的工作单独写成要给函数,如
DWORD WINAPI AsyncronousThread(
LPVOID lpParameter // thread data){
..}(2)在函数FuncC中使用CreateThtread函数将(1)中的函数创建一成一个线程,然后直接返回 。
CreateThread( 。.,AsyncronousThread, 。);return;}当然,写一个异步函数的方法很多,但是一个本质不会变,就是必须要依据多线程才能实现 。
2. 什么是异步编程 传统的同步编程是一种请求响应模型,调用一个方法,等待其响应返回.
异步编程就是要重新考虑是否需要响应的问题,也就是缩小需要响应的地方 。因为越快获得响应,就是越同步化,顺序化,事务化,性能差化 。
异步编程通常是通过fire and forget方式实现,发射事件后即忘记,做别的事情了,无需立即等待刚才发射的响应结果了 。(发射事件的地方称为生产者,而将在另外一个地方响应事件的处理者称为消费者).异步编程是一种事件驱动编程,需要完全改变思路,将“请求响应”的思路转变到“事件驱动”思路上,是一种软件编程思维的转变.下面几种你看参考一下
1、异步编程模型 (APM) 模式(也称为 IAsyncResult 模式),其中异步操作要求 Begin 和 End 方法(例如,异步写操作的 BeginWrite 和 EndWrite) 。对于新的开发工作不再建议采用此模式 。
2、基于事件的异步模式 (EAP) 需要一个具有 Async 后缀的方法,还需要一个或多个事件、事件处理程序、委托类型和 EventArg 派生的类型 。EAP 是在 .NET Framework 2.0 版中引入的 。对于新的开发工作不再建议采用此模式 。
3、基于任务的异步模式 (TAP),该模式使用一个方法表示异步操作的启动和完成 。.NET Framework 4 中引入了 TAP,并且是 .NET Framework 中异步编程的建议方法 。
3. java 异步编程 用异步输入输出流编写Socket进程通信程序 在Merlin中加入了用于实现异步输入输出机制的应用程序接口包:java.nio(新的输入输出包,定义了很多基本类型缓冲(Buffer)),java.nio.channels(通道及选择器等,用于异步输入输出),java.nio.charset(字符的编码解码) 。
通道(Channel)首先在选择器(Selector)中注册自己感兴趣的事件,当相应的事件发生时,选择器便通过选择键(SelectionKey)通知已注册的通道 。然后通道将需要处理的信息,通过缓冲(Buffer)打包,编码/解码,完成输入输出控制 。