委托BegionInvoke和窗体BegionInvoke

本文详细介绍了如何使用委托BeginInvoke执行多线程任务,并通过实例解释了BeginInvoke与EndInvoke的配合使用,以及如何通过回调函数处理异步操作的返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

转载于:https://www.cnblogs.com/mol1995/p/7614820.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值