自定义事情有啥用
前记:曾在很长一段时间,我在迷糊在类中定义自定义事件和方法到底有什 么区别?明明感觉能调用方法来实现的功能为什么需要用事件?就如CSDN上某个XX说,有脱了裤子放屁之嫌~~呵呵,我不敢苟同,既然微软能搞出这个玩意 必然有它的一定存在性,怪就怪在我们学习还很肤浅。今天特意在网上逛了一大圈,终于知晓了其中某些原理。特记录如下!
假设我们现在要实现一个功能:预先定义了一个类,该类在执行某一个方 法的同时还需要通知调用方执行到了什么程度,而在设计这个类时,我们并不知道是谁要来调用方法,所以就不可能在方法的执行过程中写上一个调用方的方法(一 般我们就称这个方法为回调方法)。固然,如果你不采用委托+事件的原理,这个功能就不好实现了(至少我现在还不知道怎么实现,难道再定义一个接口再反射? 很麻烦!),故而,委托+事件的的方法就可以派上用场啦
首先定义一个逻辑实现的类,该类的任务需要实现逻辑功能并能时刻通知调用方它的状态是怎样的,具体实现如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
/// <summary>
/// 首先定义委托,这个肯定是少不了的,至于参数,可以随意,实现功能便可,这里就是要利用参数来实现通知啦。所以定义了一个string类型。
/// </summary>
/// <param name="info"></param>
public delegate void EventHandle(string info);
class Class1
{
/// <summary>
/// 定义事件,这个事件就需要在调用方绑定回调方法啦,因为有了回调方法,才能起到通知的效果!
/// </summary>
public event EventHandle EventHandleTest;
/// <summary>
/// 该方法就是假设实现逻辑的方法了
/// </summary>
public void Start()
{
if (EventHandleTest != null)
{
Thread.Sleep(1000);//假设这里执行了一段逻辑代码
//重点重点:
这里就是利用上面定义的事件去调用“调用方”的回调方法啦~!通知的目的就在于这里了,比如在winform开发中,你需要在这里更新主界面上的某个
Label告知她此处执行到了哪里(当然是多线程),传统的方法你就需要在这里指明的调用Program类的某个方法啦~也就是说,您必须要知道被调用方
的情况下去“通知”它,而采用委托+事件的方法,您就不再了解到底是谁来调用这个方法啦~只要它绑定了回调方法,通知便能准确的到达!故而增加了代码的重
用性!而通知的信息就是根据参数来传递的咯咯
EventHandleTest("完成进度20%");
Thread.Sleep(1000);//假设这里执行了一段逻辑代码
EventHandleTest("完成进度40%"); //执行回调通知
Thread.Sleep(1000);//假设这里执行了一段逻辑代码
EventHandleTest("完成进度60%"); //执行回调通知
Thread.Sleep(1000);//假设这里执行了一段逻辑代码
EventHandleTest("完成进度80%"); //执行回调通知
Thread.Sleep(1000);//假设这里执行了一段逻辑代码
EventHandleTest("完成进度100%"); //执行回调通知
}
}
}
}
前天的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Class1 c = new Class1();
//如果用Class1中的Start方法来实现功能,并且需要加上通知,就需要事先绑定好回调函数咯
c.EventHandleTest += new EventHandle(c_EventHandleTest);
//当回调函数绑定好后,就可以开始调用方法了
c.Start();
Console.Read();
}
/// <summary>
///
这个就是回调方法啦,通过传过来的参数--也就是通知的信息,您就可以知道你调用的Start方法到底执行得怎么样啦!当然,如果在winform的多线
程开发模式中,您可能还需要this,Invoke+delegate的方法来更新主线程上的控件Text
/// </summary>
/// <param name="info"></param>
static void c_EventHandleTest(string info)
{
//throw new NotImplementedException();
Console.WriteLine(info);
}
}
}
后记:与timer的使用方法比较,还有一点比较迷 糊的就是:如果我要调用Start方法并且要得到通知,我就需要首先绑定好回调函数然后才能调用Start方法,但是在timer的使用中,无论它的 start方法或者enbled写在绑定方法之前或者之后,都能实现调用!这点还是比较迷糊的,有时间再好好理解理解啦~~