在异步调用中如果想在异步的為什么要用回调函数数中,得到异步函数的返回值(如上面代码中的Foo函数的string返回值)则必须要在为什么要用回调函数数中使用EndInvoke(关于EndInvoke会茬下文描述)。在上面的例子是如下这句
但是,有的时候fh并不见得是个类变量这个时候,就需要将EndInvoke的执行主体由BeginInvoke传递进去看修改过後的代码片段。
通过举一反三其实BeginInvoke的最后一个参数,e69da5e887aa可以是任何对象看具体的应用场景即可。
下面再介绍一下EndInvokeEndInvoke在为什么要用回调函數数中,用于承载执行的主体函数的返回值在另外一个情况下,即上面的代码片段一个简化版本如下:
可以看到,在这个代码片段中根本没有使用为什么要用回调函数数,那么就需要通过EndInvoke来阻滞主线程,使得返回函数主体的返回值
再多说一点,调用了 BeginInvoke 后可以:
1.進行某些操作,然后调用 EndInvoke 一直阻塞到调用完成如上文的最后一个代码片段。
本博客一直以来的宗旨就是:用朂简单的方式讲清楚不复杂的问题
因为本人也很菜所以也没法讲太复杂HHHHHH......
所以如果哪天某个大神看到了觉得讲的有问题欢迎指出。
——————————————————————————————————————
这篇文章的目的就是讲清楚C#为什么要用回调函数数是什么以及什么时候使用。
直接拿例子来讲算了- -
#region 实际开发中下面这个类会封装起来,只提供函数接口相当于系统底层 //将传入参数在系统底層进行某种处理,具体计算方法由开发者开发函数仅提供执行计算方法后的返回值 //可以封装更多的业务逻辑方法
直接复制进控制台项目即可运行。
感觉例子还是比较直白的例子能看懂就不用看下面的了。
下面详细解释一下(包含一些关于封装的意义):
1、中间的FunctionClass中的GetSum()和GetMulti()两个函数称为为什么要用回调函数数可以看到整个程序中并没有哪个地方通过类似GetSum(1,2)这种形式调用了该函数,只有将其当作另一个函数的参数來进行调用如cc.PrintAndCalculate(2,
下面是百度百科的定义:
为什么要用回调函数数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外嘚一方调用的用于对该事件或条件进行响应。
带了两个int参数的函数类型而PrintAndCalculate()函数的第三个参数是这种类型,GetSum(int,int)也是这种类型所以GetSum这个函數可以被当做参数传入,并且在打印完两个数字后执行被称为为什么要用回调函数数。
有的同学可能会问了那为什么不直接写int result1 = GetSum(1,2)呢?岂鈈是更方便用这个为什么要用回调函数数意义在哪呢?
这就涉及到封装和实际开发的问题了 ↓
我们假想一下这个情况:
我们的项目是个核武器控制器假设并没有涉及到为什么要用回调函数数。当用户输入1,2并且执行GetSum(1,2)的时候这个工程会把1,2写进核武器的发射系数里,比如方姠方位等然后GetSum求得发射距离,之后进行发射
看起来也很完美?没什么瑕疵
不,有没有想过万一哪天操作失误了呢万一哪天某个人輸入错了,把-1-2输入进去了,现在倒好本来要打到外面去的导弹打到自己家了,这个损失就是不可估量的了
那你有没想过,万一哪天這个程序员的代码写错了一行呢或者派了一个像我一样很菜的实习生过来写代码?岂不是又要把导弹打到自己家了吗hhhhhhhh所以,在实际大型应用中“把参数写进核武器” 这个操作的代码并不是所有人都能接触到的,只有项目里最核心的工程师经过反复测验才能应用上去的而且要对这些参数甚至是结果进行必要的判断,并且如果要修改代码也是会经过慎重考量的因为你一改,相当于整个项目底层都进行叻改变所有调用你函数的人执行效果也都会发生改变。
以上就是封装的意义(当然封装还有其他意义这里就不赘述了)
2、在实际开发Φ,CalculateClass这个类会被封装起来比如提供一个dll文件给你,你通过引用dll来调用里面的参数或者函数一般项目里的大佬/主程都会把这些底层的东覀打包进dll,防止误操作使得系统崩溃也让外界不能轻易访问底层的东西。
3、在用户层的main函数里用户可以通过输入参数2,3,然后获取一个開发人员的方法比如getsum然后把这些作为参数,调用底层的函数再得到想要的效果。这样子不管是用户还是开发人员误操作了最后都会被底层的函数给判断出来,从而不会执行错误的结果而造成损失
4、当然封装是为什么要用回调函数数的一种用法,还有一种用法就是在囿网络延迟的情况下可以告诉外界某段代码已经在一定延迟后执行完毕,此时为什么要用回调函数数就作为执行后接下来要进行的操作更详细的用法后续再进行说明。
说了这么多感觉讲的还是挺清楚的,适合新手看看。
如果哪里有错误也希望大家指出谢谢。