委托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。

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