个人对委托与线程的见解(上)

委托相关

        对于委托,我们都知道他是一个引用类型,具有引用类型所具有的通性。需要知道的是它保存的不是实际值,只是是保存对存储在托管堆中的对象的引用。或说的直接点,委托就相当于叫人帮忙,让你帮你做一些事情。我这里就举一些委托操作的小实例,来简单的说一下。

        在开始举例之前,再说一下,委托一般包含三个方法,分别是BeginInvoke、EndInvoke、Invoke。EndInvoke就不必说了,一看就知道是干嘛的。Invoke 和BeginInvoke,前一个是同步委托,后一个是异步委托,何为同步,何为异步呢?其实也可从字面意思理解,同步就是同时进行的,不能说你先执行,我后执行,那么异步就是与同步相对的,但是也不全相对,因为异步的执行不受主进程的影响,执行全看它个人了。

        这里所说的委托都是自己新建的委托,但还有种委托,是C#控件自带的委托,也分有同步异步之分,控件委托用处很大,在后面说线程的时候会说到,因为在使用线程时,有时控件委托是必要的。

        下面先单独说一个委托的例子吧:

第一步:

        //创建委托
        private delegate void testDelegate();

第二步:

        //定义委托API
        private event testDelegate TestClick;
        public void OnTest()
        {
            testDelegate handler = TestClick;
            if (handler != null)
                handler();
        }

第三步:

            //调用委托API
            OnTest();
第四步:


这是委托最常用也是很实用的一个例子,我们可以通过这种方式,实现不同窗体之间的交互,比如在A窗体调用委托API,在B窗口实例化API方法,这样就能达到在A窗口控制B窗口方法的执行。那么你可能就会问,我想传参数怎么办,其实很简单,委托API的传参与普通方法的传参类似,只需要在定义委托和API时这样定义:


        注意:

这里的handler其实类似于 handler.Invoke();,也就是同步委托,调用即执行。那么异步委托只需要写成handler.BeginInvoke(null, null);,这是没有回调函数的异步委托,当然想要调用回调函数,只需如下编写:


拓展

委托实现异步线程,也可理解为非UI异步线程,为啥要我要说可以理解为非UI异步线程呢,因为它的委托创建与UI没有直接关系

        #region 非UI异步线程
        private object _args;
        public delegate void RunHandler(object args);//事件处理委托
        private event RunHandler Runs;//委托事件
        private event RunHandler CallBackFun;//委托事件
        public delegate void CallBackDelegate(RunHandler handler, object args);
        CallBackDelegate _d = TakesAWhile;

        /// <summary>
        /// 执行入口
        /// </summary>
        /// <param name="run"></param>
        /// <param name="callBackFun"></param>
        /// <param name="args"></param>
        public void DoProcess(RunHandler run, RunHandler callBackFun, object args)
        {
            Runs = run;
            _args = args;
            CallBackFun = callBackFun;
            //创建有回调函数的异步线程
            _d.BeginInvoke(Runs, _args, CallBack, _d);
            //创建无回调函数的异步线程
            //_d.BeginInvoke(Run, _args, null, null); 
        }

        /// <summary>
        /// 定义委托引用的方法
        /// </summary>
        /// <param name="handler"></param>
        /// <param name="args"></param>
        private static void TakesAWhile(RunHandler handler, object args)
        {
            if (handler != null)
            {
                RunHandler invoke = handler;
                invoke(args);
            }
        }

        /// <summary>
        /// 定义委托调用完毕后回调函数
        /// </summary>
        /// <param name="ar"></param>
        private void CallBack(IAsyncResult ar)
        {
            if (ar == null)
            {
                throw new ArgumentException("ar");
            }

            CallBackDelegate id = ar.AsyncState as CallBackDelegate;

            id.EndInvoke(ar);
            if (CallBackFun != null)
            {
                RunHandler invoke = CallBackFun;
                invoke(_args);
            }
        }
        #endregion

这里只对委托使用做了一部分举例,更多的用法,大家可以多多实践,去发现新大陆,我这里就先不去发现了,因为接下来准备浅谈一下线程。


猜你喜欢

转载自blog.csdn.net/qwerdfcv/article/details/80291152