2012-09-07 77 views
0

我想起了一個問題。比方說,我想給一個變量theVar傳遞給下面C#將參數傳遞給事件處理程序

new EventHandler<AsyncCompletedEventArgs>(evHandler) 

事件處理程序的聲明,並在下面的定義接受它:

public void evHandler(object sender, EventArgs e) 
{ 
} 

我該如何繼續?

+0

這是您的事件處理程序(您是否正在調用處理程序)還是僅僅想使用具有現有事件的對象(「變量」)?也就是說,處理程序的簽名可能會更好,因爲['evHandler(object sender,AsyncCompletedEventArgs args)'](http://msdn.microsoft.com/zh-cn/library/db0etb8x.aspx)? – 2012-09-07 22:32:29

+0

[傳遞給EventHandler的參數]的可能的重複(http://stackoverflow.com/questions/8644253/pass-parameter-to-eventhandler) – nawfal

回答

2

如果你是編寫提高事件的代碼的人,那麼霍普金森先生在他的回答中非常好。您需要一個帶有屬性的自定義EventArgs來表示您希望傳遞的數據。

但是,如果您只是消耗事件而不是提高事件,那麼您的選擇就會受到更多限制。

由於您希望從事件中接收AsyncCompletedEventArgs,但您確實有一個選項:AsyncCompletedEventArgs的UserState指令。當您調用最終導致事件被觸發的異步方法時,這是一個屬性。它可以是您選擇的任何對象。您在調用async方法時提供它,並且在方法調用完成時,該事件會在事件參數屬性中將其返回給您。

+0

不錯,我會記得那一個。雖然希望我會想知道當我開始TonysAsynchCompletedEventArgs課程時用戶的身份。 –

+0

感謝這兩種方法。我會選擇這個答案,因爲這種情況在我的代碼中更普遍,即我只是消耗事件。 – Mika

1

定義EventArgs的後代

例如,

public class MySpecialEventArgs :EventArgs 
{ 
    public int theVar {get; private set;} 

    public MySpecialEventArgs(int argVar) 
    { 
     theVar = argVar; 
    } 

} 

然後,當你提高的情況下拋出上述之一,而不是EventArgs的

當你把你的處理程序Ë將是一個MySpecialEventArgs。

+0

我同意這一點,但它假定你有控制代碼,提高事件。 –

+0

@AnnL更多的是先決條件而不是假設。是否有一些令人討厭的黑客來避免它? –

相關問題