• 异步委托操作BeginInvoke和EndInvoke


    BeginInvoke,有两个参数,一个调用方法的参数列表。

    例如:

    delegate int TestDelegate(int i);
    int Add(int i){    }
    TestDelegate td
    =new TestDelegate(Add);
    td.BeginInvoke(
    1/*params*/,null,null);
     

    代码中 1 就是参数列表了,数量可以是0-N,数量对应方法的参数个数!

    列表参数之后就是第一个参数AsyncCallback callback,这个参数也许也是个委托吧!如果方法执行完毕。就调用callback的方法执行后续。这个可为null

    第三个参数是Object asyncState,如果第二个参数不用,也就不用了,直接null,如果第二个参数有,通常就传这个委托对象过去。因为MSDN上说这样方便在callback中调用EndInvoke;  

    EndInvoke,有一个参数列表,一个参数

    参数列表是,由于调用既方法,有ref 或者out参数,才需要的。

    另一个参数是IAsyncResult类型,MSDN用几个字描述了:表示异步操作的状态。

    还有就是MSDN声明了一个要点就是

    每次都要调用 EndInvoke 来完成异步调用。

    调用的大概流程就是

    第一步:IAsyncResult result =xyzdelegate.BeginInvoke(a,null,null) (个人认为,如果有callback就不用result了,不过未经证实)

    第二步:有两种方法知道呢个异步调用既完成

    (1)result.AsyncWaitHandle.WaitOne();这个会一直等,等到真是完成!才会执行下一行代码!

    (2)

    while(result.IsCompleted == false){

         呢度你做咩野无人理,当然调用既方法还在执行!

    }

    第三步object return_value=xyzdelegate.EndInvoke(result);其中object 可以改为函数的返回类型。

    如果用到AsyncCallback则要再定义一个函数:

    void funtion_name(IAsyncResult result)

    那样

    EndInvoke就中这个Callback函数中执行,当然代码你要自已写.至于调用EndInvoke的对象就是(xyzdelegate)result.AsyncState

    ps:这个xyzdelegate是自自己定的。

  • 相关阅读:
    mysql日期转化
    跳来跳去,到底去大公司还是小公司?
    年度重大升级,IntelliJ IDEA 2019.2 稳定版发布
    3年Java,鏖战腾讯
    重磅!挑战Oracle,华为将开源 GaussDB 数据库
    厉害了,Java EE 再次更名为 Jakarta EE
    彻底干掉恶心的 SQL 注入漏洞, 一网打尽!
    PostgreSQL 荣获 2019 年 O'Reilly 终身成就奖
    Intellij IDEA 智能补全的 10 个姿势,简直不能太牛逼!
    注意,千万不要打断工作中的程序员
  • 原文地址:https://www.cnblogs.com/mlog/p/2456406.html
Copyright © 2020-2023  润新知