您的位置:首页 > 其它

触发事件,检查是否注册过事件的方法

2015-01-12 09:16 369 查看
下面的代码,会发现事件没有被注册

class Program
{
static void Main(string[] args)
{
EventCheck check = new EventCheck();
check.OnDataArrived(new DataArrivedEventArgs() { data="Hello World!"});
Console.ReadKey();
}

static void check_DataArrived(object sender, DataArrivedEventArgs e)
{
Console.WriteLine(e.data);
}
}

class EventCheck
{
//第三步 use the delegate type to declare a variable that can refer to any method with the same signature as the delegate.
//To associate the event with the method that will handle the event, add an instance of the delegate to the event.
//The event handler is called whenever the event occurs, unless you remove the delegate.
internal event DataArrivedEventHandler DataArrived;

//第四步
internal void OnDataArrived(DataArrivedEventArgs e)
{
try
{
//DataArrivedEventHandler handler = DataArrived;
//if (handler != null)
//{
//    handler(this, e);
//}
DataArrived += EventCheck_DataArrived;
if (DataArrived != null)
{
DataArrived -= EventCheck_DataArrived;
DataArrived(this, e);
}
}
catch (Exception ex)
{
Console.WriteLine("遇到异常{0}", ex.Message);
}
}

void EventCheck_DataArrived(object sender, DataArrivedEventArgs e)
{
Console.WriteLine(e.data);
}
}

//第二步   Represents the method that will handle an event when the event provides data.
//This method's first parameter is of type Object and refers to the instance that raises the event.
//Its second parameter is derived from type EventArgs and holds the event data.
//If the event does not generate event data, the second parameter is simply the value of the EventArgs.Empty field.
//Otherwise, the second parameter is a type derived from EventArgs and supplies any fields or properties needed to hold the event data.
delegate void DataArrivedEventHandler(object sender,DataArrivedEventArgs e);  //正式写代码的时候,可以使用EventHandler<TEventArgs>泛型委托

//第一步
//create a custom event data class, create a class that derives from the EventArgs class and provide the properties to store the necessary data.
//The name of your custom event data class should end with EventArgs.
class DataArrivedEventArgs : EventArgs
{
internal string data;
}


修改第四步的代码,先将事件复制到临时变量里面,然后通过这个临时变量来处理,就不会有问题

//第四步
internal void OnDataArrived(DataArrivedEventArgs e)
{
try
{
//DataArrivedEventHandler handler = DataArrived;
//if (handler != null)
//{
//    handler(this, e);
//}
DataArrived += EventCheck_DataArrived;
DataArrivedEventHandler handler = DataArrived;
if (handler != null)
{
DataArrived -= EventCheck_DataArrived;
handler(this, e);
}
}
catch (Exception ex)
{
Console.WriteLine("遇到异常{0}", ex.Message);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐