using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 线程实验2
{
class Program
{
public delegate object myDelegate(object o);
public static myDelegate myDel;
static void Main(string[] args)
{
myDel=new myDelegate(cal);
myDel.BeginInvoke(5,new AsyncCallback(callback),myDel);//5是委托方法需要的参数,mydel是传给回调函数的状态
Console.ReadLine();
}
public static object cal(object o)
{
(o)*5; //这里值得注意,将object先拆箱,在装箱。具体的定义请参考msdn
}
public static void callback(IAsyncResult iar)
{
myDel =(myDelegate)iar.AsyncState; //获得主函数传过来的状态,要用到强制类型转换
object t = myDel.EndInvoke(iar); //EndInvoke方法的返回值就是被调用方法的返回值,即cal的返回值
Console.WriteLine(t.ToString());
}
}
}
/*大家可以单步一下,看程序的执行顺序,反正我是大开眼界
*/
/**********************************************************************************************************************************/
多播委托(MulticastDelegate)提供了一种类似于流水线式的钩子机制,只要加载到这条流水线上的委托,都会被顺序执行。因为所有的委托都继承自MulticastDelegate,因此所有的委托都具备多播特性。最简单的理解:一个委托,但同时可以执行多个方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 委托试验3
{
class Program
{
public delegate void MyDelgegate(string str);
public static MyDelgegate Mydel1 = new MyDelgegate(callback1);
public static MyDelgegate Mydel2 = new MyDelgegate(callback2);
public static MyDelgegate Mydel3;
static void Main(string[] args)
{
Mydel3 += Mydel1;
Mydel3 += Mydel2; //将callback1和callback2方法都加到mydel3中去。
Mydel3("Hello,FirstCallBack!");
Mydel3 -= Mydel1; // 将callback1从委托mydel3中去除
Mydel3("Hello,SecondCallBack!");
//ydel2("Hello,SecondCallBack!");
Console.ReadLine();
}
public static void callback1(string str)
{
Console.WriteLine("这是第一个调用!"+str);
}
public static void callback2(string str)
{
Console.WriteLine("这是第二个调用!" + str);
}
}
}
调试结果为: