2012-09-07 76 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更多的是先决条件而不是假设。是否有一些令人讨厌的黑客来避免它? –

相关问题