在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
如果一个方法拥有一个委托类型的参数,则调用此方法时,可以直接将一个匿名方法作为方法实参:
Lambda表达式:
SomeDelegateType del=arguments=>arguments.ToString();
回调:
基于接口的回调:
public partial class MainForm : Form
{
void MainFormLoad(object sender, EventArgs e)
{
Controler c=new Controler(new CallBackClass());
Timer t=new Timer();
t.Interval=1000;
t.Tick+= delegate { c.Begin();};
t.Start();
}
}
interface ICallBack
{
void Run();
}
class CallBackClass:ICallBack
{
public void Run()
{
MessageBox.Show(string.Format("second:{0}", DateTime.Now.Second));
}
}
class Controler
{
private ICallBack CallBackObject=null;
public Controler(ICallBack obj)
{this.CallBackObject=obj;}
public void Begin()
{
if(DateTime.Now.Second%3==0)
{
CallBackObject.Run();
}
}
}
这是单个回调的实现例子 利用委托实现回调:
定义需要回调的对象AB,Controler类用来添加删除回调对象,有一个触发方法CallBack(),当满足条件秒数为3的倍数时调用所有的回调方法d.Invoke()
定时回调:
public delegate void TimerCallback(Object state);
public System.Threading.Timer(TimerCallback callBack,Object state,int dueTime,int period) callBack:要定时回调的方法
无须多解释,代码够简洁
多线程回调:
static int[] CreateIntArray()
{
int[] arrs=new int[10];
Random r=new Random();
for(int i=0;i<10;i++)
arrs[i]=r.Next(0,100);
return arrs;
}
static void ShowArray(int[] arr)
{
string str="";
for(int i=0;i<10;i++)
str+=string.Format("({0})={1} ",i,arr[i]);
MessageBox.Show(str);
}
class MyThread{
public Func<int[]> createArr;
public Action<int[]> showArr;
//threading function
public void SortArray(){
int[] arr=createArr();
showArr(arr);
//sort array
//ShowArray(arr);
}
}
void MainFormLoad(object sender, EventArgs e)
{
MyThread t=new MainForm.MyThread();
t.createArr=CreateIntArray;
t.showArr=ShowArray;
Thread thread=new Thread(t.SortArray);
thread.Start();
} 先定义了两个待回调的方法,然后定义了一个MyThread类,里面有两个委托和数据处理方法,作为线程处理方法,然后启动线程
做笔记的好处是可以比较细的过书上写的东西,预留了思考空间,就像上面的“回调”的典型代码,使用委托回调更方便程序改动。
下期预告:事件及事件驱动
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论