C#事件多线程(一)

事件(Event)

概念

事件是对象在外界第三方因素影响下发生的事情,而对外提供的一种消息机制

事件的两个参与者

  1. 发送者(Sender):对象本身,当本身状态发生变化时,触发事件,并通知事件的接收者

  2. 接收者(Receiver):用来处理事件的,在事件发送者触发一个事件后,会自动执行的内容

事件和委托

相同点:

事件对象本质就是一个私有的委托对象,以及公有的方法,add(+=)和remove(-=)

不同点:

  1. +=方法是,实际上是调用add方法对委托进行添加。

  2. 委托对象私有以后,无法直接从外部赋值(内部可以赋值)。

  3. 好处:能够避免用户直接将对象事件清除,比如微软给内部事件,只允许通过add或者remove进行注册和移除事件,而不能清除掉。这样做能够保护委托。理解事件是对委托的封装

异步编程

同步方法

程序运行的时候,在调用其他方法的时候,会等待被调用的方法按顺序执行完,才会继续执行。非常符合开发思维,有序执行

假如:张三、李四、王麻子、秦七、赵六现在要王者开黑。
问题:张三游戏加载20s
     李四游戏加载30s
     王麻子游戏加载1m
     秦七游戏加载40s
     赵六游戏加载1m20s
最终需要等待焦国栋游戏加载完成才能同时进入游戏
这就是所谓同步编程

例如:银行柜台办理业务,只有一个业务窗口在营业。所有人只能排队等候

异步方法

在程序调用异步方法的时候,主程序不会等待方法执行完,而是主程序调用异步方法后直接继续运行,而异步方法会启动一个新线程来完成方法的计算。

假如:张三、李四、王麻子、秦七、赵六现在测试
问题:张三完成所有题目30m
     李四完成所有题目50m
     王麻子完成所有题目40m
     秦七完成所有题目45m
     赵六完成所有题目1h30m
     考试时间不限的,谁先交卷谁先回家吃饭
不管谁先完成不会影响其他人,五个人之间相互没有任何关系

异步编程

委托的异步调用

  1. 先根据比较耗时的功能方法声明对应的委托

  2. 给委托赋值,赋与这个耗时的功能函数

  3. 采用委托的BeginInvoke方法进行异步调用委托

    Invoke方法:类似于默认的方法调用,相当于直接使用()调用委托 BeginInvoke方法:指采取异步调用委托

  4. 给BeginInvoke方法创建回调函数

    回调函数:回调函数是指,当前的正在执行的操作完成之后,立刻回调用的一个函数是回调函数

    BeginInvoke方法参数组成:

    1. 第一组参数:委托所指向的方法对应的参数

    2. AsyncCallback参数:与当前委托对应的回调函数

    3. object参数:假如回调函数需要参数则由object参数提供

    BeginInvoke方法返回值为IAsyncResult,而委托的回调函数必须有一个参数为IAsyncResult类型

  5. 通过EndInvoke获取对应委托的BeginInvoke的执行结果

  6. 因为BeginInvoke相当于重新创建的线程进行异步调用方法函数,所以回调函数也是异步的线程的执行的,那么异步线程和程序主线程相当于阳关道和独木桥,

    因此如果使用Winform或WPF中的控件要考虑清楚:UI中的控件等都是Winform或WPF主线程中创建的,而异步线程无法直接使用

    设置CheckForIllegalCrossThreadCalls =false,这个属性是用来设置Winform或者WPF中的主线程不在做控件的跨线程检测

    public partial class Form1 : Form
    {
        public Form1()
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            func1 = Fun1;
        }
        Func func1;
      
        private void button1_Click(object sender, EventArgs e)
        {
            IAsyncResult result = func1.BeginInvoke(2,10,new AsyncCallback(CallBackFunc),null);
            lbl2.Text =Fun2(10).ToString();
        }
​
        void CallBackFunc(IAsyncResult result)
        {
            this.lbl1.Text= func1.EndInvoke(result).ToString();
        }
​
        int Fun1(int num,int num2)
        {
            System.Threading.Thread.Sleep(5000);//等待5秒钟
            return num * num;
        }
​
        int Fun2(int num)
        {
            return num * num;
        }
    }

 

你可能感兴趣的:(C#,c#)