委托


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

原文地址:https://www.cnblogs.com/cdaq/p/4618610.html