1
委托 存放函数安全指针
2 步骤
/// <summary>
/// 定义委托类型
/// </summary>
public delegate void DGSayHi(string name);
/// <summary>
/// 生明委托变量
/// </summary>
DGSayHi dgSayHi = null;
//初始化委托
dgSayHi = new DGSayHi(SayHi);
//委托追加方法
dgSayHi += SayHi2;// dgSayHi=(DGSayHi)Delegate.Combine(dgSayHi, SayHi2);
//w委托移除方法
dgSayHi -= SayHi2;
//调用
dgSayHi("刘兴");
//dgSayHi.Invoke("刘兴");内部其实是这样的
3 异步调用委托
////1.异步调用委托
//MyDelegate md = new MyDelegate(GetSum);
////开始异步调用委托
//md.BeginInvoke(1, 30, null, null);
//Console.WriteLine("主线程继续........");
//Console.ReadKey();
////获取方法的返回值
////1.异步调用委托
//MyDelegate md = new MyDelegate(GetSum);
////开始异步调用委托
////BeginInvoke()返回值就是返回了一个对象,这个对象实现了IAsyncResult接口,并且该对象中封装了一些关于当前异步执行的委托的一些状态信息。
//IAsyncResult asyncResult = md.BeginInvoke(1, 30, null, null);
//for (int i = 0; i < 10; i++)
//{
// Console.WriteLine("主线程继续执行.." + i);
//}
////调用EndInvoke会阻塞线程,等待异步委托执行完毕。
//int sum = md.EndInvoke(asyncResult);
//Console.WriteLine("方法执行的返回值为:{0}", sum);
//Console.WriteLine("主线程继续........");
//Console.ReadKey();
4
异步调用委托 并且调用回调函数
//=======异步调用委托中的回调问题======================
MyDelegate md = new MyDelegate(GetSum);
//开始异步调用委托
IAsyncResult result = md.BeginInvoke(1, 30, new AsyncCallback(Callback),
"Test");
Console.WriteLine("主线程继续执行。。。。。");
Console.ReadKey();
}
//该回调函数有系统自动调用,当指定的异步委托调用完毕后,自动调用该方法
static void Callback(IAsyncResult syncResult)
{
Console.WriteLine("===================回调函数中的线程Id:{0}", Thread.CurrentThread.ManagedThreadId);
//syncResult.AsyncState获取的就是BeginInvoke()中的最后一个参数。
Console.WriteLine("回调函数的参数:{0}", syncResult.AsyncState);
//在回调函数中调用EndInvoke()方法就可以获取返回值。
//需要把接口类型转换为具体的对象
AsyncResult ar = syncResult as AsyncResult;
int sum = ((MyDelegate)ar.AsyncDelegate).EndInvoke(ar);
Console.WriteLine("返回值是:{0}", sum);
}
static int GetSum(int n1, int n2)
{
Console.WriteLine("===================异步调用的函数GetSum中的线程Id:{0}", Thread.CurrentThread.ManagedThreadId);
int sum = 0;
for (int i = n1; i <= n2; i++)
{
sum += i;
Thread.Sleep(100);
}
Console.WriteLine("方法中输出的结果:{0}", sum);
return sum;
}
}
public delegate int MyDelegate(int n1, int n2);
------黑 5
5 微软定义的委托
#region 泛型委托
//Func<string> funDel = () => { return "ok"; };
//Func<string, string> funDelDemo = (string s) => { return s + "sss"; };
//Func委托微软提供了16个参数的重载,最后一个泛型的约束就是 返回值的类型。
//Func都会有返回值
//Func<string,int,string,bool>
//Func<int,int,int> demoFunc = new Func<int, int, int>(AddFunc);
//没有返回值的委托
//Action<int,int>
#endregion