C#基础- Callback 回调

这个是2011年写的一个技术贴,现在看可能有点过时了,有兴趣的朋友也可以看一下。

一. 描述

在开发winform程序时不会考虑页面刷新问题,只要控制好线程别导致假死就ok了,但是在开发web页面程序时,刷新有的时候真是头痛的很。页面回调可以解决这个问题,下面简单就实用来讲对callback做下介绍。

过程可以简单的这样理解:

客户端 通过fun_callbk() 将值  传给  服务端RaiseCallbackEvent()

服务端处理完后通过 GetCallbackResult() 将值又  返回  客户端的 showMsg() 

二. 讲解

在网上看了很多关于原理呀什么的讲解,起初也是一头雾水,如果只是使用,不用了解那么多,那些原理在开发web网络功能时可以多了解一下,相关知识可以到网上搜一下,在这里我就简单说一下如何使用。

其实你只要走完5步就完成了,很简单:

1.设置触发事件,例如:

<div οnclick="fun_callbk('大家好我是王东银)">click me</div>

2.编写两个客户端函数,例如:

...

function fun_callbk(msg)//这个函数就是你点击事件要触发的方法,其中就写一句话

{

<%=this.ClientScript.GetCallbackEventReference(this,"msg","showMsg",null)%>

//这句话简单讲就是在客户端注册一个引用,其中的参数你可以到网上搜一下,一般使用4个参数就够了

//第一个参数:指的是page类

//第二个参数:事件触发方法的参数

//第三个参数:接收服务端返回数据的函数,下面会定义

//第四个参数:一般设为null就可以了

}

function showMsg(rValue)//这个就是上面的第三个参数,接受服务端返回的值

{

alert(rValue);//简单点写,弄的那么复杂大家就看迷糊了

}

3.编写服务端程序

这一步比较简单了,你必须要做的三件事:

a.引用一个接口:ICallbackEventHandler,这是必须的,和前面的类或接口以,隔开(这是c#基础了)

b.声明第一个函数,用于接收客户端传来的值,如下:

//记住:函数名字不可以随便,必须是RaiseCallbackEvent才可以

//首先声明一个变量,方便讲解

string myStr=string.Empty;

public void RaiseCallbackEvent(string arg)

{

myStr=arg+"hello";//还是简单的写,将客户端传来的值赋给咱新声明的变量

//加一个hello,是为了验证数据的确是有服务端处理后返回的

}

c.声明另一个函数,用于将结果返回客户端

//这个函数的名字也必须是GetCallbackResult,不可以修改

public string GetCallbackResult()     {         return myStr;//将结果返回客户端     }

好了,到这里你基本已经完成了!

三. 做一下总结

其实就用到4个方法,fun_callbk(), showMsg(), GetCallbackResult(), RaiseCallbackEvent()

需要添加一个引用:<%=this.ClientScript.GetCallbackEventReference(this,"arg,"showMsg",null)%>

需要继承一个接口:ICallbackEventHandler就这些 

案例二:通过委托的方式实现回调操作

public class Lib
{
        public delegate void UserFunctionCB();
        private static UserFunctionCB m_userFnCB;

        /// <summary>
        /// 初始化时把需要回调的函数传入
        /// </summary>
        /// <param name="func"></param>
        public static void InitCallbackFunction(UserFunctionCB func)
        {
            m_userFnCB = func;
        }

        /// <summary>
        /// 当程序出现异常时会自动触发此函数
        /// (在这里我就不过多的描述异常捕获的过程了)
        /// </summary>
        /// <param name="func"></param>
        public static void HandleExceptionForNDK()
        {
            // 出现异常时调用用户自定义函数
            CallUserFunction();
        }

        /// <summary>
        /// 回调执行用户设置的函数
        /// </summary>
        private static void CallUserFunction()
        {
            if (m_userFnCB != null)
            {
                IAsyncResult result = m_userFnCB.BeginInvoke(delegate(IAsyncResult ar)
                {
                    m_userFnCB.EndInvoke(ar);
                }, null);

                // 执行50毫秒后超时
                result.AsyncWaitHandle.WaitOne(50, true);
            }
        }
}

以下是调用部份:

public class Demo
{
    void Start()
    {
        var m_callbackFn = new Lib.UserFunctionCB(CallBackFunction);
        Lib.InitCallbackFunction(m_callbackFn);
    }

    /// <summary>
    /// 回调函数实现部份
    /// </summary>
    private void CallBackFunction()
    {
         Debug.LogError("print of call back function!");
    }
}

 由于这个例子是在Unity下使用的,直接把代码抠出来的,直接拷贝是编译不通过的。

发布了85 篇原创文章 · 获赞 30 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/qq_42672770/article/details/104424573