美文网首页
c#中委托、事件和回调

c#中委托、事件和回调

作者: 星辰_大海 | 来源:发表于2019-03-06 21:39 被阅读0次

以前写的一个小程序,近来无事改来玩,有一个类执行一些事务性操作,通过winform窗口调用这个类,原来事务类的设计没有事件,在窗口调用时也没有使用多线程,这样就存在几个问题:

1. 事务运行事件长了的话,窗口就会假死,不响应用户的操作;

2. 事务类运行情况窗口不知道,不知道事务究竟执行到什么进度了;

于是就重构代码解决以上问题,第一步改写事务类

    public class clsXUT

    {

        public class Cls_Head

        {

        }

        const int StartIndex = 2244;        //第一份试卷头部的起始位置

        const int HeadLength = 1032;        //头部长度

        const byte DirFlag = 0;

        const byte FileFlag = 1;

        public List<Cls_Head> Head = new List<Cls_Head>();

        public event Action<int> progress;      //定义的事件

        public Action<int> p;                  //定义的回调函数,也就是一个没有返回值的委托

        private string xutfn;

        private string outpath;

        public clsXUT(string xutfilepath,string outdir)

        {

            xutfn = xutfilepath;

            outpath = outdir;

        }

        public void run()

        {

            FileStream fs;

            byte[] mmb = Resource1.mmb;

            fs = new FileStream(xutfn, FileMode.Open, FileAccess.Read);

            byte[] buf = new byte[HeadLength];

            while (true)

            {

                //if (progress != null)                                          //如果事件处理程序被绑定

                //    progress(Convert.ToInt32(fs.Position / fs.Length) * 100);  //激发事件

                if (p != null)

                    p(Convert.ToInt32(fs.Position / fs.Length) * 100);            //激发回调函数,函数在用户那里实现

                if (fs.Position >= fs.Length) break;                              //如果到文件结尾则退出

                if (fs.Position == 0) fs.Position = StartIndex;

                fs.Read(buf, 0, buf.Length);

                Head.Add(new Cls_Head(buf));

                Cls_Head head = Head.LastOrDefault();

                if (head.Flag == Cls_Head.FlagType.FileFlag)

                {

                    byte[] data = new byte[head.FileLength];

                    fs.Read(data, 0, data.Length); 

                    FileStream fw = new FileStream(outpath + "\\" + head.Path, FileMode.OpenOrCreate);

                    fw.Write(data, 0, data.Length);       

                    fw.Close();

                }

            }

            fs.Close();

        }

    }

窗口调用代码:

        private void button4_Click(object sender, EventArgs e)

        {

            //以多任务方式来调用事务类

            Task task = new Task(() =>

            {

                string path = textBox2.Text;

                xut = new clsXUT(textBox1.Text, path);               

                xut.progress += Xut_progress;              //使用事件

                xut.p += Xut_progress;                      //使用回调方法

                xut.run();

            });

            task.Start();                                  //启动任务,新版可以使用 dot net4.5使用Task.run(()=>{});

            //亦可使用线程,new Thread(()=>{}).Start()

        }

        private void Xut_progress(int pre)

        {

            if (this.InvokeRequired)

                this.BeginInvoke(new MethodInvoker(() => { progressBar1.Value = pre; }));

                //异步方式更新界面的进度条

        }

通过对比发现事件和回调函数其本质应该是一致的!有空再写个简单的对比程序,编译后看看有啥不同!

相关文章

  • C# 高级语言总结

    后续 1 C# 委托 委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 ...

  • c#中委托、事件和回调

    以前写的一个小程序,近来无事改来玩,有一个类执行一些事务性操作,通过winform窗口调用这个类,原来事务类的设计...

  • 深入理解回调 CallBack

    相信大家都知道委托和事件,没错,委托和事件是用来传递和保存函数用的,那么 回调 呢,近段时间的学习中经常碰到 回调...

  • C# 基础知识系列- 11 委托和事件

    0. 前言 事件和委托是C#中的高级特性,也是C#中很有意思的一部分。出现事件的地方,必然有委托出现;而委托则不一...

  • (转).NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位。 C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括...

  • C#委托和Java回调

    一、观察者模式 C#和Java这两大流行的编程语言,相似程度极高。本文就来欣赏一下C#委托和Java回调的异曲同工...

  • 傻傻分不清楚(代理,委托,协议,事件,block)

    tag: C # , iOS 总结C#中的观察者模式(利用委托 和事件(即委托的方法))V...

  • 委托

    委托(delegate)特别用于实现事件和回调方法。 所有委托都派生于system.Delegate类。 创建一个...

  • 委托

    简介 C#的委托与JS中的回调函数非常相似,即先定义一个形参为委托,而这个形参委托存储的是其实例化所绑定的方法,那...

  • unity & C#相关

    事件和委托 C#事件和Unity3d - CSDN博客 Unity常用的函数和遇到的C#的知识整理 Unity常用...

网友评论

      本文标题:c#中委托、事件和回调

      本文链接:https://www.haomeiwen.com/subject/uvrfpqtx.html