2009-05-27 70 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; 
}