委托的BeginInvoke和EndInvoke
刚刚搞明白了C#的异步调用,写下来,方便后续调用。
异步主要是解决UI假死的问题,而开辟出一个新的线程,处理大数据。
1.既然是委托的调用,那么先定义个委托:
public delegate bool CheckUpdateFile();
2.定义一个将要工作的委托函数,和委托类型一致
private bool Press() { //处理大数据 //如读取大文件,网络通讯等 return true; }
3.声明及初始化委托实例,运行该实例
BeginInvoke( AsyncCallback callback,object @object) //原型
需要一个带有IAsyncResult 参数类型的函数,如:private void callback(IAsyncResult ar)
CheckUpdateFile fun = new CheckUpdateFile(Press);
fun.BeginInvoke(callback, fun);
//回调函数
private void callback(IAsyncResult ar)//该参数功能强大,万能型,可以传object
{
if (!ar.IsCompleted) return;//没有完成,不结束改线程。
var fun = (CheckUpdateFile)ar.AsyncState;//强类型转换为委托对象
//var sar = (AsyncResult)ar;
//var fun= (MyDelegate)sar.AsyncDelegate;
var isok = fun.EndInvoke(ar);//结束后返回委托Press的结果
if (isok)
{
Invoke((EventHandler)delegate
{
//匿名方法体,委托完成后,将要做什么。
});
}
}
二、还可以使用匿名函数来写
var fun = new CheckUpdateFile(Press); fun.BeginInvoke(ar => { if (!ar.IsCompleted) return; //var fun = (CheckUpdateFile)ar.AsyncState;声明在前部分,不需要转换。 var isok = fun.EndInvoke(ar);//结束后返回委托Press的结果
if (isok) { Invoke((EventHandler)delegate { }); } }, fun);//fun可写为null,匿名函数中不需要转换