2009-05-27 11 views
3

Je souhaite créer une classe qui initialise une minuterie qui sera utilisée comme un noyau central pour les autres membres de la classe afin de s'enregistrer pour l'événement écoulé par minuterie. Mon problème est que je ne sais pas vraiment comment exposer l'événement écoulé par minuterie à d'autres classes. Une solution, que je pense que le travail de force est que j'expose simplement la minuterie comme une propriété publique qui renverra l'objet de la minuterie et je peux appeler la minuterie événement écoulé de cet objet, par exemple:Enregistrement d'événements écoulés par minuterie

MyAppTimer appTimer = new MyAppTimer(); 
Timer timer = appTimer.GetAppTimer; 
timer.Elapsed += SomeMethod; 

Mais avec cette solution j'exposerai la minuterie entière que je ne veux pas. Comment puis-je passer une méthode dans la classe MyAppTimer qui enregistrera la méthode avec l'événement écoulé du temporisateur en interne? Est-ce quelque chose à voir avec les délégués? Peut-être quelque chose comme:

public void RegisterHandler(someStuffGoesHere) //What do I pass in here? 
{ 
    timer.Elapsed += someStuffGoesHere; 
} 

Répondre

3

Vous pouvez créer un événement avec des accesseurs explicites:

public event EventHandler TimerElapsed 
{ 
    add { timer.Elapsed += value; } 
    remove { timer.Elapsed -= value; } 
} 

Les clients de votre classe peuvent souscrire directement à l'événement TimerElapsed:

appTimer.TimerElapsed += SomeHandlerMethod; 

Si vous voulez pour utiliser une méthode RegisterHandler comme indiqué dans votre code, le type du paramètre doit être EventHandler

EDIT: Notez qu'avec cette approche, la valeur du paramètre sender sera l'objet Timer, pas l'objet MyAppTimer. Si c'est un problème, vous pouvez le faire à la place:

public MyAppTimer() 
{ 
    ... 
    timer.Elapsed += timer_Elapsed; 
} 

private void timer_Elapsed(object sender, EventArgs e) 
{ 
    EventHandler handler = this.TimerElapsed; 
    if (handler != null) 
     handler(this, e); 
} 
+0

C'est ce que J'ai cherché ... thanx :) – Draco

+0

En regardant à nouveau ce code, je vois qu'il a un inconvénient: la valeur du paramètre expéditeur sera l'objet Timer, pas l'objet MyAppTimer ... cela pourrait poser problème si vous devez connaître l'expéditeur. Je vais mettre à jour ma réponse pour une solution de contournement –

0

Vous souhaitez exposer un événement de votre classe, quelque chose comme:

class A 
{ 
    public event EventHandler<EventArgs> Elapsed; 

    private void OnElapsed() 
    { 
     if(Elapsed!=null) 
       Elapsed(new EventArgs()); 
    } 
} 

dans la méthode privée OnElapsed vous avez un exemple comment augmenter l'événement. Vous utilisez ensuite la classe A de la même manière que vous utiliseriez Timer.

2

Comme d'autres l'ont mentionné, l'exposition d'un événement est probablement la façon dont vous voulez aller, mais pour répondre à votre question sur le type requis dans votre méthode de registerHandler, il ressemblerait à quelque chose comme:

using System.Timers; 

...snip... 

public void RegisterHandler(ElapsedEventHandler callback) 
{ 
    timer.Elapsed += callback; 
}