2009-05-27 78 views
3

我想创建一个类,它初始化一个定时器,该定时器将用作其他类成员的中心核心,以便为定时器已用事件注册自己。我的问题是我真的不知道如何将定时器过期事件暴露给其他类。一个解决方案,我认为可能的工作是,我只是暴露定时器作为公共财产,这将返回计时器对象,我可以从这个对象调用的计时器经过事件,例如:注册定时器已用事件

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

但与此解决方案我将暴露我不想要的整个计时器。我怎样才能传入MyAppTimer类中的一个方法,该方法将在内部注册该方法和计时器已过去的事件?这与代表有关吗?也许是这样的:

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

回答

3

你可以明确的存取创建一个事件:

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

类的客户端可以直接订阅TimerElapsed事件:

appTimer.TimerElapsed += SomeHandlerMethod; 

如果你想要使用您的代码中所示的RegisterHandler方法,参数的类型应为EventHandler

编辑:请注意,使用此方法,sender参数的值将是Timer对象,而不是MyAppTimer对象。如果这是一个问题,你能做到这一点,而不是:

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

这是什么我一直在寻找...... thanx :) – Draco 2009-05-28 09:17:33

0

你想在你的类暴露一个事件,是这样的:

class A 
{ 
    public event EventHandler<EventArgs> Elapsed; 

    private void OnElapsed() 
    { 
     if(Elapsed!=null) 
       Elapsed(new EventArgs()); 
    } 
} 
在OnElapsed私有方法

你有一个例子,如何提高事件。然后以与使用Timer相同的方式使用A类。

2

正如其他人所说,揭露事件可能是你想要去的方式,但回答你关于你的RegisterHandler方法所需的类型的问题,它看起来是这样的:

using System.Timers; 

...snip... 

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