委托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。
不建议使用阻塞函数,因为主界面会假死,跟不用多线程没有区别。