当前位置:编程学习 > C#/ASP.NET >>

c#-回调callback是什么原理,机制?

c#-回调callback是什么原理,机制?
回调函数什么?
回调方法是什么原理?
为什么要用回调方法?
回调方法有什么好处?
怎样用回调方法?
谢谢 --------------------编程问答-------------------- 我只知道委托、事件 --------------------编程问答-------------------- 回调是个概念而已,C#里面更加倾向于用 delegate来实现而已(我以为,这是最好的方式了。)
Java就比较SB了,只能用接口+接口方法来搞。
C++就比较灵活了,什么都可以当回调函数,。
--------------------编程问答-------------------- call back 就是we call u not u call me是个什么公司的广告
写的东西当一个事件发生才被运行,比如用户按了按钮,因为你不知道用户什么时候按按钮,所以你要用回调函数。 --------------------编程问答-------------------- java不是用接口,是用listener --------------------编程问答--------------------
引用 4 楼 lude8880 的回复:
java不是用接口,是用listener


基本上你还比较初级阶段。 --------------------编程问答--------------------
引用 5 楼 healer_kx 的回复:
引用 4 楼 lude8880 的回复:
java不是用接口,是用listener


基本上你还比较初级阶段。

 我看你智商不高,情商更差。 --------------------编程问答-------------------- 我java从1.02awt开始编的你呢? --------------------编程问答--------------------
引用 7 楼 lude8880 的回复:
我java从1.02awt开始编的你呢?


我为我的话向你道歉算了。

不过我91年的时候就开始学习编程了。。。 。。。
你说的Listener,确实说明你还没有对这个问题有深刻的认识。
--------------------编程问答-------------------- 共勉,正在学习中!

希望下面的文章会对你有帮助。

http://www.kuqin.com/dotnet/20080119/3777.html --------------------编程问答--------------------
引用 8 楼 healer_kx 的回复:
引用 7 楼 lude8880 的回复:
我java从1.02awt开始编的你呢?


我为我的话向你道歉算了。

不过我91年的时候就开始学习编程了。。。 。。。
你说的Listener,确实说明你还没有对这个问题有深刻的认识。

哈哈哈,我90年开始编的。哈哈哈 --------------------编程问答-------------------- 别哈哈了,90年还一个三角啊,我好歹两个三角啊,我也哈哈。
--------------------编程问答-------------------- 过几天你再看三角,哈哈哈哈 --------------------编程问答-------------------- c#高级编程我今天看了580页了 --------------------编程问答--------------------
引用 12 楼 lude8880 的回复:
过几天你再看三角,哈哈哈哈


你说你的三角会多起来?
我不信哦。。。可别倒分啊。。。 --------------------编程问答--------------------
引用 13 楼 lude8880 的回复:
c#高级编程我今天看了580页了


大哥,别搞笑了吧,Java的Listener基本上不是接口,就是抽象类好不好。。。 。。。

Tomcat的Lifecycle接口也是用于回调的,人家也没有叫Listener啊。。。 。。。
--------------------编程问答-------------------- 你先在这里自娱自乐啊,我去Web板块接分玩去了。。。 --------------------编程问答-------------------- 围观! --------------------编程问答-------------------- a listens b
b触发事件后a的方法被调用,这难道不是回调? --------------------编程问答-------------------- 甘草?不是C++的么,杂有空上这儿玩了 --------------------编程问答--------------------
引用 18 楼 lude8880 的回复:
a listens b
b触发事件后a的方法被调用,这难道不是回调?


哥哥,有点逻辑,我并没有否认Listener是一种回调方式,好不好?
倒是Listener本事是一种接口方式的回调,你缺看不到,而去否认它。。。 。。。
你那么早写Java,都干什么了?
--------------------编程问答--------------------
引用 19 楼 balenoww 的回复:
甘草?不是C++的么,杂有空上这儿玩了


好啊,~
最近不玩C++了,开始在MFC版升两星,并打算在这里升一个星星,Web板块再搞个星星。 --------------------编程问答-------------------- 我在java版两天就俩星了。 --------------------编程问答-------------------- 看看你说什么了? --------------------编程问答--------------------
引用 22 楼 lude8880 的回复:
我在java版两天就俩星了。


你知道两个星星是多少分不? 你知道目前一个人一天最多能得多少分不?
裤衩是裤衩,星星是星星。。。 。。。
--------------------编程问答-------------------- 另外,哥们,这是你问出来的问题嘛?
http://topic.csdn.net/u/20080827/11/10596d56-fb65-421a-8843-3985e8b90ef3.html

--------------------编程问答--------------------
引用 17 楼 clxcxx 的回复:
围观!
--------------------编程问答-------------------- 谢谢大家的激烈讨论。
大家都是高手。

回调方法是什么原理? 
为什么要用回调方法? 
回调方法有什么好处? 

上面的问题我还是不明白。。。 --------------------编程问答-------------------- ? --------------------编程问答-------------------- 我也报手围观 --------------------编程问答--------------------
引用 29 楼 bingg 的回复:
我也报手围观

??????? --------------------编程问答-------------------- 笑死我了你們 --------------------编程问答-------------------- 在.net Framework 中,要传递方法,就必须把方法的细节封装在一种新的类型的对象中,即委托。委托只是一种特殊的对象类型,其特殊之处在于,我们以前定义的所有对象都包含数据,而委托包含的只是方法的细节。

这是从书上查到的,如果在vs6.0下写过委托的话,估计就好理解了 --------------------编程问答-------------------- 三楼要说的是
你站着别动,我们会叫你的 好莱坞的流行语 --------------------编程问答--------------------
引用 22 楼 lude8880 的回复:
我在java版两天就俩星了。


SB --------------------编程问答--------------------
引用 34 楼 yuwenge 的回复:
引用 22 楼 lude8880 的回复:

我在java版两天就俩星了。 


SB

現在三個星了歐,sb --------------------编程问答-------------------- 。。。。。。。。。。。。。。。 --------------------编程问答-------------------- 围观,楼上的三位兄弟继续辩论,楼下的继续当裁判。 --------------------编程问答-------------------- 这贴相当火爆哦 --------------------编程问答-------------------- 都跑题了啊~

比较通俗的理解就是:一个函数被当作一个变量传递给一个方法,这个方法在执行是会使用到这个函数,那么这个函数就被叫做回调函数。而传递这个函数的地址是通过函数指针传递的。那么在.NET平台中,我们就是通过传递一个委托,来实现回调函数的功能。

fun();

viod method(Type t1,Type t2, fun())
{
  ....;
  fun();
  ....
}

操作系统拥有更广泛意义上的回调,那就是消息机制。消息本是 Windows 的基本控制手段,乍看与函数调用无关,其实是一种变相的函数调用。发送消息的目的是通知收方运行一段预先准备好的代码,相当于调用一个函数。

具体你可以看下http://akerlee.bokee.com/4343352.html,这里对回调讲的比较清楚
在.NET里,回调被报包装了,成了委托,关于委托和事件你可以看下:http://blog.csdn.net/cc_net/archive/2008/05/21/2467717.aspx
--------------------编程问答-------------------- callback是实现异步事务处理交互的一种方式
对象A有一件自己不愿意或者不好完成的工作要做,它选择委托给对象B来完成,这样B完成工作的同时A可以干点儿想干的事情,如果B完成了工作希望及时通知A,这时候可以通过告诉B一个可以及时联系到A的途径,即callback
从实现上来说,callback是一个delegate
在C、C++中,callback可以是任何函数指针
--------------------编程问答-------------------- 90年开始编程 跟 91年开始编程 都一样,两个纯SB --------------------编程问答-------------------- 顶上下楼主。

我也学习一下。 --------------------编程问答--------------------
引用 41 楼 tspchip 的回复:
90年开始编程 跟 91年开始编程 都一样,两个纯SB

不厚道呀,不带这样挖坟的 --------------------编程问答-------------------- 这楼歪的... --------------------编程问答-------------------- --------------------编程问答--------------------
引用 44 楼 chrisak 的回复:
这楼歪的...
确实是歪 --------------------编程问答-------------------- YY滴,你们搞啥嘛?

41楼滴,没事翻把老帖顶出干吗,看过就看过了,还非要顶一下。 --------------------编程问答-------------------- 回调函数的示例代码,,,,仅如何使用,原理我也说不上来~先会用吧,

        /// <summary>
        /// 普通方法
        /// </summary>
        public void Speak() {
            //do something
        }

        /// <summary>
        /// 代理(定义)
        /// </summary>
        public delegate void SpeakHandler();

        /// <summary>
        /// 测试
        /// </summary>
        public void Test() {
            SpeakHandler handler = new SpeakHandler( this.Speak );
            handler.BeginInvoke( new AsyncCallback( Callback ), this );
        }

        /// <summary>
        /// 回调函数
        /// </summary>
        /// <param name="ar"></param>
        public void Callback( IAsyncResult ar ) {
            SpeakHandler handler = ar.AsyncState as SpeakHandler;
            if( handler != null ) {
                handler.EndInvoke( ar );
            }
        }
--------------------编程问答--------------------

        public IAsyncResult BeginReset(AsyncCallback callback,object state)
        {
            if(this.IsDisposed){
                throw new ObjectDisposedException(this.GetType().Name);
            }
            if(!this.IsConnected){
throw new InvalidOperationException("You must connect first.");
}
if(!this.IsAuthenticated){
throw new InvalidOperationException("The RSET command is only valid in authenticated state.");
}

            ResetDelegate asyncMethod = new ResetDelegate(this.Reset);
            AsyncResultState asyncState = new AsyncResultState(this,asyncMethod,callback,state);
            asyncState.SetAsyncResult(asyncMethod.BeginInvoke(new AsyncCallback(asyncState.CompletedCallback),null));

            return asyncState;
        }

这个是从LumiSoft.NET源码摘出来的一段,其中
ResetDelegate的定义:
private delegate void ResetDelegate();
AsyncResultState的定义:
internal class AsyncResultState : IAsyncResult{//...}
Reset方法的定义
public void Reset(){//...}
供参考~ --------------------编程问答-------------------- 混战 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 一年多前的坟帖...41楼不厚道,48楼真实在啊... --------------------编程问答-------------------- 好酒 --------------------编程问答-------------------- 迟来的围观。
49楼实在。 --------------------编程问答-------------------- 搬个板凳,爆米花...围观中... 真火爆
--------------------编程问答-------------------- 回调函数,就是程序在执行过程中,某个条件触发后,去调用的那个函数,这需要用到函数指针,通过函数指针找到函数的入口地址,执行回调函数。

在.net中,用委托来实现,委托是对函数指针的安全封装。 --------------------编程问答-------------------- 这贴真是热门啊. --------------------编程问答-------------------- 什么时候的帖了?我竟然是沙发 --------------------编程问答-------------------- 支持一个! --------------------编程问答-------------------- 太牛逼了  --------------------编程问答--------------------
引用 56 楼 computerfox 的回复:
回调函数,就是程序在执行过程中,某个条件触发后,去调用的那个函数,这需要用到函数指针,通过函数指针找到函数的入口地址,执行回调函数。

在.net中,用委托来实现,委托是对函数指针的安全封装。


方法(参数1,参数2,回调函数)

就是把 参数1,和参数2传给  回调函数

委托是对函数指针的安全封装
以前的函数指针是 不安全的
原因就是 方法(参数1,参数2,回调函数)  也许回调函数只接受一个参数,或参数类型不同~
而.net的委托 指定了回调函数的签名  于是他安全了

我是看C#的高级编程 中多线程那章才懂的
然后我学过C++ 和反汇编 所有理解起来特别快  炫耀一下  呵呵 --------------------编程问答-------------------- 54楼你太2了,这么老的帖子都让你给挖出来了。2008年的…… --------------------编程问答-------------------- 90、91都没有Java吧 --------------------编程问答--------------------
引用 46 楼 zcw840421 的回复:
引用 44 楼 chrisak 的回复:
这楼歪的...
确实是歪


歪而不倒,围观。。。。。 --------------------编程问答-------------------- 盖到80楼封顶
回调就是引用函数指针
你别找我,有事我会呼叫你,(一般由操作系统来调用) --------------------编程问答-------------------- 还是没明白 --------------------编程问答--------------------
引用 2 楼 healer_kx 的回复:
回调是个概念而已,C#里面更加倾向于用 delegate来实现而已(我以为,这是最好的方式了。)
Java就比较SB了,只能用接口+接口方法来搞。


以前的java版本确实如此,所以才有了23个设计模式中的种种像100年前中国老太太的裹脚布一样的模式代码。有个事件(甚至只要有普通的delegate),设计就清晰自然了。 --------------------编程问答-------------------- 有个事件(甚至只要有普通的delegate)  -->  如果GOF懂、或者当时java有了事件(甚至只要有普通的delegate) --------------------编程问答-------------------- 路过,瞧瞧 --------------------编程问答-------------------- c#的callback,去问微软 --------------------编程问答-------------------- 简单的说,就是回调函数就是一个通过函数指针调用的函数,把一个方法的地址做为本函数的参数进行处理,C#常用的就是委托和事件,但是回调函数的概念从C++继承而来,归源于C++的指针机制。通过回调可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。
  如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
  回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。
  另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。
   对于设计者来说是考虑到接口的方便和资源分配的自由
   --------------------编程问答-------------------- 你们这群古墓丽影 --------------------编程问答-------------------- 此乃神贴。 --------------------编程问答-------------------- 好象是windows 的回调函数还是什么 --------------------编程问答-------------------- lz诈尸,毛小方何在

额,这两天摸金校尉比较多,全是诈尸贴 --------------------编程问答-------------------- 不倒的神贴 --------------------编程问答-------------------- 专程围观 --------------------编程问答-------------------- 都是牛人 --------------------编程问答-------------------- 回调这个问题字面上不好解释,解释了听起来也比较迷糊,你下一个回调的Demo,看代码,在根据理论深入理解吧 --------------------编程问答-------------------- 且见一坟中群魔乱舞,煞是好看。 --------------------编程问答-------------------- 回调是相对程序员调用和系统调用来说的
比如程序员在一个函数参数中传入另一个函数指针,那只是函数地址作为参数,程序员确实知道什么时候调用,这个不不叫回调
按照系统的声明写出一个函数并向系统注册,由系统来调用(不知什么时候调用),那才叫回调

用C写过Windows GUI程序,写过消息处理函数WndProc(也可能叫其它名字),就知道啥是回调函数了
只会.Net,要理解回调,确实难些

强烈建议吹水要上税 --------------------编程问答-------------------- 神贴,路过,再顶!!! --------------------编程问答-------------------- 讲得很好!!!谢谢 --------------------编程问答-------------------- 今天搜东西找出这个神贴,有必要继续挖出来吗? --------------------编程问答-------------------- 热,没弄多久.net  听别人说几回  委托回调了,委托我晓得,回调是什么?热,回来赶紧百度,翻来覆去,慢慢怎懂了,回调就那么个意思,就是一个委托,运行时不确定性,条件性触发,系统调用,奶奶的,就是他奶娘的一个委托哇,热,取回调这个名字,害的我又杀了几个脑细胞,真是的
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,