委托的概念,百度里是这样说的,“委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性”。简单来说就是把方法当作参数进行传递。这里只是略微的提下,不多做解释,典型的事例就是winform里面button控件的onclick事件方法,如果有需要,可能从这里入手,网上有很多对于这方面的详细讲解。
我们这里主要说的委托的异步调用,在日常工作中,执行一个业务流程之后,很多时候需要其他后续操作(例:修改记录状态等),如果是普通的业务还好,但如果是一个耗时较长的业务,我们就不可能直接等待他处理完成后在进行后续操作,这时很多人会想到使用线程和线程池(Thread,ThreadPool),这样就可以直接将业务交付给线程处理,这样看起来确实也没什么问题,但是在某些场景下可能不太适用,或者说比较难以实现,比较常见的一个实例就是微信支付接口,做过微信支付的人基本都知道,主要就是一个发起支付的申请事件和一个支付完成的回调事件,发起和回调是分开,这样就不可能简单的使用线程去实现,因为你并不知道发起之后几时才需要去回调,简单来说就是你无法获取他支付完成后的状态,这时,委托的异步调用就派上用场了,下面例子只是简单的模拟委托的异步调用,实际支付并不是如此简单,请大家理解
//声明委托
public delegate bool payDelegate();
//对应委托方法
public bool payApply()
{
//提交申请的相关业务
}
//回调方法
private void payCallBack(IAsyncResult ar)
{
AsyncResult asyncResult = (AsyncResult)ar;
payDelegate paydg = (payDelegate)asyncResult.AsyncDelegate;
bool result = paydg.EndInvoke(ar); //获取对应委托方法的返回值
//回调需要执行的方法
if(result)
{
//成功执行的业务
}
}
private void pay()
{
payDelegate paydg = new payDelegate(payApply);
AsyncCallback callBack = new AsyncCallback(payCallBack);
paydg.BeginInvoke(callBack,null);
}