简体   繁体   English

EventHandler和ElapsedEventHandler之间有什么区别?

[英]What are the differences between EventHandler and ElapsedEventHandler ?

So far in my limited use of c# I've subscribed to a couple of events. 到目前为止,我对c#的使用有限,我订阅了几个活动。 Why do the following two code snippets use two diferent words EventHandler and ElapsedEventHandler ? 为什么以下两个代码片段使用两个不同的单词EventHandlerElapsedEventHandler

        myProcess = new Process();
        myProcess.StartInfo.FileName = @"notepad.exe";
        myProcess.Exited += new EventHandler(MyProcessExited);

compared to: 相比:

        myTimer = new System.Timers.Timer(tickLength);
        myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);

are these words EventHandler and ElapsedEventHandler specific to the object whose event I'm using? 这些单词是EventHandlerElapsedEventHandler特定于我正在使用其事件的对象吗? Or are there a whole set of objects where I have to use "EventHandler" and different set of objects where I have to use "ElapsedEventHandler" ? 或者是否有一整套对象,我必须使用“EventHandler”和不同的对象集,我必须使用“ElapsedEventHandler”? (ie for set X of objects we use xxxxxEventHandler etc) (即对于我们使用xxxxxEventHandler等对象的集合X)

Are these words EventHandler and ElapsedEventHandler specific to the object whose event I'm using? 这些单词EventHandler和ElapsedEventHandler是否特定于我正在使用其事件的对象?

This words are names of delegates. 这个词是代表的名字。 And they are specific to information, which is passed from object, which raised event to subscribers of that event. 它们特定于信息,它从对象传递,将事件引发给该事件的订阅者。 Read about events, delegates and parameters passing below. 阅读下面传递的事件,代表和参数。

An event in C# is a way for a class to provide notifications to clients of that class when some interesting thing happens to an object. C#中的事件是一种类,当对象发生一些有趣的事情时,类可以向该类的客户端提供通知。 Events are declared using delegates . 使用委托声明事件。

So, if you want to notify client of some interesting thing happened in your object, you can declare delegate: 因此,如果您想通知客户端您的对象中发生了一些有趣的事情,您可以声明委托:

public delegate void SomethingHappenedDelegate();

And declare event of this type in your class: 并在您的班级中声明此类型的事件:

class Foo
{
    public event SomethingHappenedDelegate SomethingHappened;

    // other code, which raises SomethingHappened event
    // when something interesting happened
}

When clients of this class want to be notified that something interesting happenedthey should subscribe to SomethingHappened event. 当这个类的客户想要被告知发生了一些有趣的事情时,他们应该订阅SomethingHappened事件。 And event handler signature must match type of event (SomethingHappenedDelegate in this case): 事件处理程序签名必须与事件类型匹配(在本例中为SomethingHappenedDelegate):

static void Main(string[] args)
{
    Foo foo = new Foo();
    foo.SomethingHappened += new SomethingHappenedDelegate(Foo_SomethingHappened);            
}

// this method should be: void MethodName()
static void Foo_SomethingHappened()
{
    // you notified, that something happened
}

When you need to pass some additional data when notifying clients, you should use different delegate type, which takes some arguments. 当您在通知客户端时需要传递一些其他数据时,您应该使用不同的委托类型,这需要一些参数。 For example, if you want to pass some message to clients, change event's delegate type: 例如,如果要将某些消息传递给客户端,请更改事件的委托类型:

public delegate void SomethingHappenedDelegate(string message);

Now you should change event handler to correspond this delegate type: 现在,您应该更改事件处理程序以对应此委托类型:

static void Foo_SomethingHappened(string message)
{
    // you notified, that something happened and you recieved a message
}

Another example, if we want to pass instance of object, which raised an event, and some additional arguments message and time: 另一个例子,如果我们想传递一个对象的实例,它引发了一个事件,还有一些额外的参数消息和时间:

public delegate void SomethingHappenedDelegate(object sender, string message, DateTime time);

Then we should have event handler with same signature: 然后我们应该有相同签名的事件处理程序:

static void Main(string[] args)
{
    Foo foo1 = new Foo();
    foo1.SomethingHappened += new SomethingHappenedDelegate(Foo_SomethingHappened);
    Foo foo2 = new Foo();
    foo2.SomethingHappened += new SomethingHappenedDelegate(Foo_SomethingHappened); 
}

// we use same event handler for all SomethingHappened events
static void Foo_SomethingHappened(object sender, string message, DateTime time)
{
    Foo foo = sender as Foo; // now we get object, which raised event
    // and we can use message and time
}

So, all events have type of some delegate. 所以,所有事件都有一些委托的类型。 Definition of that delegate describes which parameters should receive method, which will be handling event. 该委托的定义描述了哪些参数应该接收方法,这将是处理事件。 In your code you use two events - Process.Exited and Timer.Elapsed . 在您的代码中,您使用两个事件 - Process.ExitedTimer.Elapsed Lets look how these events defined: 让我们看看这些事件是如何定义的:

public event EventHandler Exited;
public event ElapsedEventHandler Elapsed;

You can see here different types of delegates: 你可以在这里看到不同类型的代表:

public delegate void EventHandler(object sender, EventArgs e);
public delegate void ElapsedEventHandler(object sender, ElapsedEventArgs e);

As you can see from definition, these delegates have same first parameter (sender), and different last parameter. 从定义中可以看出,这些委托具有相同的第一个参数(发送者)和不同的最后一个参数。 So, handlers of these events also should have different signature, which should match these delegates. 因此,这些事件的处理程序也应该具有不同的签名,这些签名应该与这些委托相匹配。

You may wonder, why name of second parameter ends with EventArgs. 您可能想知道为什么第二个参数的名称以EventArgs结尾。 If you want to notify other objects, that SomethingHappened, then following convention exists in C#: 如果要通知其他对象,那么SomethingHappened,则C#中存在以下约定:

  • event name should be SomethingHappened 事件名称应为SomethingHappened
  • if clients need some additional data to be passed, these data encapsulated in object, which derives from EventArgs class: SomethingHappenedEventArgs . 如果客户端需要传递一些额外的数据,这些数据封装在object中,该对象派生自EventArgs类: SomethingHappenedEventArgs
  • event delegate should be EventHandler (if no additional info should be passed to clients), or it should be of generic type EventHandler <SomethingHappenedEventArgs> , or it should be custom delegate with name SomethingHappenedEventHandler and signature void (object sender, SomethingHappenedEventArgs e) event delegate应该是EventHandler (如果没有其他信息应该传递给客户端),或者它应该是泛型类型EventHandler <SomethingHappenedEventArgs> ,或者它应该是自定义委托,名称为SomethingHappenedEventHandler和signature void(object sender,SomethingHappenedEventArgs e)

Read more here . 在这里阅读更多。

No, the event names are matter of framework designer choice + they are toughly coupled to delegates that rapresent the event of any specific object. 不,事件名称是框架设计者选择的问题+他们很难与代表任何特定对象的事件相关联。

EventHandler defininton is: EventHandler defininton是:

[Serializable]
[ComVisible(true)]
public delegate void EventHandler(object sender, EventArgs e);

ElapsedEventHandler definiton is: ElapsedEventHandler定义是:

public delegate void ElapsedEventHandler(object sender, ElapsedEventArgs e);

As you can see they are different delegate types. 如您所见,它们是不同的delegate类型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM