• 委托BegionInvoke和窗体BegionInvoke


    委托BegionInvoke是指通过委托方法执行多线程任务,例如:

    //定义委托成员变量

    delegate  void dg_DeleAirport();

    //指定委托函数

    dg_DeleAirport dga = AirportBLL.DeleteHistoryTransAirport;

    //通过BeginInvoke以异步线程方式执行委托函数,可通过EndInvoke获取返回值

    //如果委托函数需要传入参数,这些传入参数写在下面的两个null之前,

    //这两个参数,第一个可指明回调函数名称(函数本身可由参数,但这里不写参数),就是异步线程结束后主线程执行的函数,参数一般就是asrs,以便主线程处理返回结果,回调函数一般诸如xxxCompleted,且必须带参数(IAsyncResult asrs),回调函数如:

    void DelAirportCompleted(IAsyncResult df)
    {
           if (df != null)
                {
                    string cc=(df.AsyncState as dg_DeleAirport).EndInvoke(df).ToString();
                }
                inprocess = false;
    }

    //第二个参数表示第一个参数代表的值,往往就是调用者本身,如下句的dga。

    IAsyncResult asrs = dga.BeginInvoke(null, null);

    //此时,主线程将直接执行后续代码,不会等待委托函数执行完毕。但是,可以通过EndInvoke或asrs.IsCompleted等阻塞函数进行强制等待委托函数完成,

    //EndInvoke()函数可称为阻塞函数,阻止主进程继续往下进行直到异步线程完成。

    //EndInvoke取回委托函数返回值,返回类型跟委托的类型一样,如果委托函数返回类型是void,此函数的返回值也是void

    while(!asrs.IsCompleted())一样也可以起到强制主线程等待的作用,而且还可以在while方法中让主线程做些等待相关的操作

    dga.EndInvoke(asrs);

    while (!asrs.IsCompleted)
    {
    }

    此外,还可通过asrs.AsyncWaitHandle.WaitOne(5000, false);设置等待时间,无论是否完成,在等待时间后,继续往下进行。第一个参数表示等待毫秒数时间,在指定时间内如果异步线程完成,返回true,否则false。

    不建议使用阻塞函数,因为主界面会假死,跟不用多线程没有区别。

  • 相关阅读:
    面向对象的静态属性和静态方法
    面向对象魔术方法及类的自动加载
    面向对象
    mysql cmd 创表查表练习
    创建表 查询表以及添加数据
    windows cmd命令
    4.20 mysq数据库 创建表
    cmd控制数据库初步了解
    Jquery初步了解
    故宫博物院项目 JS功能整理
  • 原文地址:https://www.cnblogs.com/mol1995/p/7614820.html
Copyright © 2020-2023  润新知