委托的高级使用

Posted 1521681359qqcom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了委托的高级使用相关的知识,希望对你有一定的参考价值。

  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("Student0 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 thread0",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("Student0 doing homework 1 hours",this.ID,i);
            Thread.Sleep(1000);
            
        
        
    

 

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

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

以上是关于委托的高级使用的主要内容,如果未能解决你的问题,请参考以下文章

(VIP-朝夕教育)2021-05-24 .NET高级班 04-委托和事件

Natasha 高级编译类 - 第三部分

c#高级编程笔记----委托

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

Natasha 高级编译类 - 第一部分

C#高级功能ActionFunc,Tuple