zoukankan      html  css  js  c++  java
  • DotNet中异步编程(APM)的研究1异步编程介绍

    异步编程介绍(by zguosir/gshzheng)

    异步操作典型应用于要完成一项耗时或者涉及I/O的任务时,如,复杂计算,打开大型文件,连接远程计算机,进行数据库查询等等。异步操作在与程序主线程不同的线程中执行,当应用程序异步地执行操作时,主线程并不被挂起,而是可以继续的向下执行。

     

    .Net类库中(Framework Class LibraryFCL),有许多类支持异步操作,如下表,

    Area

    Class Name

    Method Name

    I/O

    Sysetm.IO.Stream

    BeginRead()

    BeginWrite()

    Dns

    System.Net.Dns

    BeginrResolve()

    BeginGetHostAddress()

    Socket

    System.Net.Sockets

    .Socket

    BeginAccept()

    BeginReceive()

    BeginSend()

    Web

    System.Net.WebRequest

    BeginGetRequestStream()

    BeginGetResponse()

    Sql

    System..Data.SqlClient

    .SqlCommand

    BeginExecuteNonQuery()

    BeginExecuteReader()

    Delegate

    System.MulticastDelegate

    BeginInvoke()

     

    异步操作要提供两个对应的方法名BeginOperation()EndOperation(),通过这两个方法来分别来开启和结束一个异步操作Operation。如FileStream类提供BeginRead()EndRead()方法,异步地从文件种读取一定的字节数。一般的,异步方法都会有与之对应的同步操作,如Read()为文件读取的同步方法。

    当调用异步方法BeginOperation(),应用程序可以继续在调用线程(主线程)上执行接下来的指令,而异步操作将在另外的线程上执行。对每一次的调用BeginOperation(),程序需要在某处相应的调用EndOperation()以得到操作的返回结果。

     

    调用异步方法BeginOperation()后,该方法返回一个实现了IAsyncResult接口的对象。这个对象保存了关于此异步操作执行的一些信息,它可以代表这次异步操作。IAsyncResult对象就像.Net CLR开给应用程序的收据,表示接收了此次异步操作的请求,并尝试开始执行。异步操作可能很快完成,可能需一段时间后完成,也可能永远也完成不了。

     

    IAsyncResultAPM编程的核心,它提供四个只读属性,在异步操作启动后,应用程序可以查询这些属性,以确定操作是否完成。下表显示了IAsyncResult接口的属性,

     

    Property

    Description

    AsyncState

    获取开启异步操作时传入的状态对象,一般用于方法回调方式

    IsCompleted

    获取操作是否完成的标志,一般用于轮巡方式

    AsyncWaitHandler

    获取用于等待操作完成的WaitHandle,一般用于等待直到完成方式

    CompletedSynchronously

    获取异步操作是否同步完成的指示。

     

    异步方法BeginOpertion()方法拥有与对应的同步方法一致的参数(无论是传值还是传引用),另外,所有的BeginOpertion()方法参数列表最后都会包含两个附加的参数,第一个为AsyncCallBack代理类型对象,当异步操作完毕后将自动调用由它代表的方法;第二个附加的参数为用户自定义的状态对象,它将存储在返回的IAsyncResult对象的AsyncState属性中。

    如果操作结束后不需要调用某个回调函数,或者不需要传入一个自定义的状态对象,在实际函数调用中,这两个最后的参数都可以为null

     

    调用EndOperation()关闭异步操作执行。此时必须传入由BeginOperaton()返回的IAsyncResult对象,才正式关闭此异步操作,以及释放和回收异步操作所用的资源。EndOperation()的返回值相当于直接调用同步方法的返回值,如EndRead()方法返回从FileStream中实际读到的字节数。

     

    如果在一个由IAsyncResult表示的异步操作还没有完成之前,调用EndOperation(),则将挂起当前线程,直到异步操作完成。异步操作中引起的异常,将由EndOperation()方法抛出来。对同一个IAsyncResult异步操作,调用多次EndOperation()方法,将引起不可预知的后果。同样,调用EndOperation(),传入的不是由同一个异步操作BeginOperation()返回的IAsyncResult对象,其后果也不可预知。



  • 相关阅读:
    Convert between Unix and Windows text files
    learning Perl:91行有啥用? 88 print " ----------------------------------_matching_multiple-line_text-------------------------- "; 91 my $lines = join '', <FILE>;
    Perl:只是把“^”作为匹配的单字:只是匹配每一行的开头 $lines =~ s/^/file_4_ex_ch7.txt: /gm;
    Perl: print @globbing." "; 和 print @globbing; 不一样,一个已经转换为数组元素个数了
    为什么wget只下载某些网站的index.html? wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com wget 下载整个网站,或者特定目录
    正则表达式中 /s 可以帮助“.”匹配所有的字符,包括换行,从而实现【dD】的功能
     是单词边界锚点 word-boundary anchor,一个“”匹配一个单词的一端,两个“”匹配一个单词的头尾两端
    LeetCode103 Binary Tree Zigzag Level Order Traversal
    LeetCode100 Same Tree
    LeetCode87 Scramble String
  • 原文地址:https://www.cnblogs.com/zguosir/p/877279.html
Copyright © 2011-2022 走看看