委托的高级使用

  1. 多播委托(multicast)一个委托里面包含了不止一个方法

    static void Main(string[] args)
            {
                Student stu1 = new Student() { ID=1,PenColor=ConsoleColor.Yellow};
                Student stu2 = new Student { ID = 2, PenColor = ConsoleColor.Green };
                Student stu3 = new Student { ID = 3, PenColor = ConsoleColor.Red };
    
                Action action1 = new Action(stu1.DoHomeWork);
                Action action2 = new Action(stu2.DoHomeWork);
                Action action3 = new Action(stu3.DoHomeWork);
                action1 += action2;
                action1 += action3;
                action1();//多播委托,根据封装方法的顺序
                //action1();//单播委托
                //action2();//单播委托
                //action3();//单播委托
                Console.ReadLine();
            }
        }
        class Student
        {
            public int ID { get; set; }
            public ConsoleColor PenColor { get; set; }
            public void DoHomeWork()
            {
            for(int i=0;i<5;i++)
            {
                Console.ForegroundColor = this.PenColor;
                Console.WriteLine("Student{0} doing homework {1} hours",this.ID,i);
                Thread.Sleep(1000);
            }
            }
        }

    2.隐式异步调用

  • 同步和异步的语言差别,在英语中异步是两个人同时做,同步是我在你的基础上做
  • 同步调用与异步调用的对比
    • 每个程序都是一个进程(process)
    • 每个进程可以有一个或者多个线程(thread)
    • 同步调用时在一个线程内
    • 异步调用的底层机理是多线程(多线程同时访问资源时,要注意线程之间争夺资源的冲突,这个时候要为线程加锁)
    • 串行=同步=单线程,并行=异步=多线程
 class Program
    {
        static void Main(string[] args)
        {
            Student stu1 = new Student() { ID=1,PenColor=ConsoleColor.Yellow};
            Student stu2 = new Student { ID = 2, PenColor = ConsoleColor.Green };
            Student stu3 = new Student { ID = 3, PenColor = ConsoleColor.Red };

            //stu1.DoHomeWork();//直接调用,同步
            //stu2.DoHomeWork();
            //stu3.DoHomeWork();

            Action action1 = new Action(stu1.DoHomeWork);//间接调用,同步
            Action action2 = new Action(stu2.DoHomeWork);
            Action action3 = new Action(stu3.DoHomeWork);
            //action1 += action2;
            //action1 += action3;
            //action1();//多播委托,根据封装方法的顺序//间接调用,同步

            //action1();//单播委托//间接调用,同步
            //action2();//单播委托
            //action3();//单播委托

            //委托的异步调用
            //action1.BeginInvoke(null,null);//隐式间接的异步调用,会生成一个分支方法,两个参数第一个参数是回调方法,只子线程执行完,需要执行什么东西
            //action2.BeginInvoke(null, null);//
            //action3.BeginInvoke(null, null);

         //一般的多线程
            Thread thread1 = new Thread(new ThreadStart(stu1.DoHomeWork));//显式的直接的异步调用,
            Thread thread2 = new Thread(new ThreadStart(stu2.DoHomeWork));
            Thread thread3 = new Thread(new ThreadStart(stu3.DoHomeWork));

            thread1.Start();
            thread2.Start();
            thread3.Start();

            //高级一点带委托的多线程
            Task task1 = new Task(new Action(stu1.DoHomeWork));//显式的异步调用
            Task task2 = new Task(new Action(stu2.DoHomeWork));
            Task task3 = new Task(new Action(stu3.DoHomeWork));

            task1.Start();
            task2.Start();
            task3.Start();

            for (int i = 0; i < 10;i++ )
            {
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.WriteLine("Main thread{0}",i);
                Thread.Sleep(1000);
            }
                Console.ReadLine();
        }
    }
    class Student
    {
        public int ID { get; set; }
        public ConsoleColor PenColor { get; set; }
        public void DoHomeWork()
        {
        for(int i=0;i<5;i++)
        {
            Console.ForegroundColor = this.PenColor;
            Console.WriteLine("Student{0} doing homework {1} hours",this.ID,i);
            Thread.Sleep(1000);

        }
        }
    }

应当适时使用接口取代对委托的使用

  • java完全使用接口取代了委托的功能,java没有与C#中委托相对应的实体
  • 重构代码一般是指把代码放在更合适的地方

原文地址:https://www.cnblogs.com/1521681359qqcom/p/11216382.html

时间: 2024-11-08 17:12:10

委托的高级使用的相关文章

[2014-9-15]异步委托线程高级

昨天悲剧,帮别人调代码,愣没调出来.还没时间写博文了. 忧桑... 昨天的今天写吧,今天也没学,就上了一天的课. 1 首先窗口间数据进行传递.也就是父窗口与子窗口数据进行传递. 用委托实现 ①,在同一命名控件下定义委托. ②,在子窗口创建委托实例. ③,在父窗口创建子窗口对象,传递委托方法. public delegate void SetString(string str);    public partial class Form1 : Form    {        public For

年度总结一下

年终总结 第一次写年终总结,并非不爱做这个事,平常确实常常回望最近做了什么,看看与原来的计划差了多少,调整一下步调,但开始上班的这一年确实少了很多像上学时那样平心静气或者胡思乱想的时间,今年上半年做毕设,下半年腱鞘炎,各种杂事也不断,浑浑噩噩就过了一年,总觉2018还没写习惯就到2019了. 2018 回望一下,事情也还是做了一些的,首先没想到的是每天早饭10分钟,看了不少书,虽然大部分都是杂书,但日积月累也总算有点成果,今年坐下来好好看的书确实不多,做毕设的时候心浮气躁心静不下来,等下半年想好

C#高级知识点概要(1) - 委托和事件

作者:linybo 要成为大牛,必然要有扎实的基本功,不然时间再长项目再多也很难有大的提升.本系列讲的C# 高级知识点,是非常值得去撑握的,不仅可以让你写代码时游刃有余,而且去研究和学习一些开源项目时,也不会显得那么吃力了. 希望大家记住,这里讲的所有的知识点,不仅仅是了解了就可以了,还要会灵活用,一定要多思考,撑握其中的编程思想. 本文讲的是委托和事件,这两个词可能你早就耳熟能详,但你是否真正撑握了呢? 本系列讲的C#高级知识点都是要求开发时能达到可以徒手写出来的水平(不依赖搜索引擎.找笔记等

[ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但足矣.要深入研究还需要去查看更多的专业资料. 要成为大牛,必然要有扎实的基本功,不然时间再长项目再多也很难有大的提升.本系列讲的C# 高级知识点,是非常值得去撑握的,不仅可以让你写代码时游刃有余,而且去研究和学习一些开源项目时,也不会显得那么吃力了. 希望大家记住,这里讲的所有的知识点,不仅仅是了解

《C#高级编程》委托、事件的示例代码

运行结果: Program.cs 1 using System; 2 3 namespace Wrox.ProCSharp.Delegates 4 { 5 class Program 6 { 7 static void Main() 8 { 9 var dealer = new CarDealer(); 10 11 var michael = new Consumer("Michael"); 12 dealer.NewCarInfo += michael.NewCarIsHere; 1

快速理解C#高级概念(一) Delegate委托

做.NET开发很久,最近重新温习<C#高级编程>一书.发现很多曾经似懂非懂的问题,其实也是能够慢慢钻研慢慢理解的. 所以,打算开写<C#高级编程系列>博文.其中会借鉴<C#高级编程>一书的概念,也会参照其他高手的博文,希望大家谅解.有不对的地方,欢迎指正. (另:本博文不会讲解定义,语法方面的基础知识.) 下面如题,我们来讲委托. Delegate委托,在.NET中应用的非常广泛.会涉及到Lambda表达式,事件,匿名方法等(请关注后续博文). 那么何为委托? 通俗的来

C#高级编程(第8版)——委托声明、使用(第一节)

首先,声明一个Currency的结构.Currency结构有自己的ToString()重载方法和一个与GetCurrencyUnit()的签名相同的静态方法.这样,就可以用同一个委托变量调用这些方法了: struct Currency { public uint Dollars; public ushort Cents; public Currency(uint dollars, ushort cents) { this.Dollars = dollars; this.Cents = cents

C#高级编程之委托

看C#高级编程第八版看到委托,有人说它和Java中的代理有些相似,但我认为这是一个C#与其他编程语言不同的地方,这也应该很重要,不然书上也不会大篇幅的讲委托的概念和应用.我在网上查阅了关于委托的资料,发现它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,混身不自在. 那初次看见"委托"这个词,我脑海中出现的第一个疑问就是: 1.什么是委托? 我看完整这个章节,依然是一知半解的,功夫不负有心人,通过强大的网路,我寻找到了答案,那到底什

IOS 开发指南 第5章 委托协议 数据源协议 高级视图学习

1 委托对象负责控制控件的外观和对控件的事件和状态作出反应 数据源对象是控件与应用数据(model)的桥梁,一般是必须实现的. 2 选择器 UIPickerView 为用户提供选择 1)日期选择器 UIDatePicker 设置属性检查器中的各个属性-代码 -setDateFormat:设置日期格式 -stringFromDate:获取时间 - (IBAction)onclick:(id)sender { NSDate * theDate = self.datePicker.date;获取选中日