事件(Event)
概念
事件是对象在外界第三方因素影响下发生的事情,而对外提供的一种消息机制
事件的两个参与者
-
发送者(Sender):对象本身,当本身状态发生变化时,触发事件,并通知事件的接收者
-
接收者(Receiver):用来处理事件的,在事件发送者触发一个事件后,会自动执行的内容
事件和委托
相同点:
事件对象本质就是一个私有的委托对象,以及公有的方法,add(+=)和remove(-=)
不同点:
-
+=方法是,实际上是调用add方法对委托进行添加。
-
委托对象私有以后,无法直接从外部赋值(内部可以赋值)。
-
好处:能够避免用户直接将对象事件清除,比如微软给内部事件,只允许通过add或者remove进行注册和移除事件,而不能清除掉。这样做能够保护委托。理解事件是对委托的封装
异步编程
同步方法
程序运行的时候,在调用其他方法的时候,会等待被调用的方法按顺序执行完,才会继续执行。非常符合开发思维,有序执行
假如:张三、李四、王麻子、秦七、赵六现在要王者开黑。
问题:张三游戏加载20s
李四游戏加载30s
王麻子游戏加载1m
秦七游戏加载40s
赵六游戏加载1m20s
最终需要等待焦国栋游戏加载完成才能同时进入游戏
这就是所谓同步编程
例如:银行柜台办理业务,只有一个业务窗口在营业。所有人只能排队等候
异步方法
在程序调用异步方法的时候,主程序不会等待方法执行完,而是主程序调用异步方法后直接继续运行,而异步方法会启动一个新线程来完成方法的计算。
假如:张三、李四、王麻子、秦七、赵六现在测试
问题:张三完成所有题目30m
李四完成所有题目50m
王麻子完成所有题目40m
秦七完成所有题目45m
赵六完成所有题目1h30m
考试时间不限的,谁先交卷谁先回家吃饭
不管谁先完成不会影响其他人,五个人之间相互没有任何关系
异步编程
委托的异步调用
-
先根据比较耗时的功能方法声明对应的委托
-
给委托赋值,赋与这个耗时的功能函数
-
采用委托的BeginInvoke方法进行异步调用委托
Invoke方法:类似于默认的方法调用,相当于直接使用()调用委托 BeginInvoke方法:指采取异步调用委托
-
给BeginInvoke方法创建回调函数
回调函数:回调函数是指,当前的正在执行的操作完成之后,立刻回调用的一个函数是回调函数
BeginInvoke方法参数组成:
-
第一组参数:委托所指向的方法对应的参数
-
AsyncCallback参数:与当前委托对应的回调函数
-
object参数:假如回调函数需要参数则由object参数提供
BeginInvoke方法返回值为IAsyncResult,而委托的回调函数必须有一个参数为IAsyncResult类型
-
-
通过EndInvoke获取对应委托的BeginInvoke的执行结果
-
因为BeginInvoke相当于重新创建的线程进行异步调用方法函数,所以回调函数也是异步的线程的执行的,那么异步线程和程序主线程相当于阳关道和独木桥,
因此如果使用Winform或WPF中的控件要考虑清楚:UI中的控件等都是Winform或WPF主线程中创建的,而异步线程无法直接使用
设置CheckForIllegalCrossThreadCalls =false,这个属性是用来设置Winform或者WPF中的主线程不在做控件的跨线程检测
public partial class Form1 : Form
{
public Form1()
{
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
func1 = Fun1;
}
Func<int,int, int> 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#中的事件(Event),强调了事件作为对象间消息传递的机制,及其与委托的联系与区别。接着探讨了异步编程,包括同步方法与异步方法的区别,以及如何使用委托进行异步调用,特别提到了在回调函数和线程安全方面需要注意的问题。
1098

被折叠的 条评论
为什么被折叠?



