我想起了一个问题。比方说,我想给一个变量theVar传递给下面C#将参数传递给事件处理程序
new EventHandler<AsyncCompletedEventArgs>(evHandler)
事件处理程序的声明,并在下面的定义接受它:
public void evHandler(object sender, EventArgs e)
{
}
我该如何继续?
我想起了一个问题。比方说,我想给一个变量theVar传递给下面C#将参数传递给事件处理程序
new EventHandler<AsyncCompletedEventArgs>(evHandler)
事件处理程序的声明,并在下面的定义接受它:
public void evHandler(object sender, EventArgs e)
{
}
我该如何继续?
如果你是编写提高事件的代码的人,那么霍普金森先生在他的回答中非常好。您需要一个带有属性的自定义EventArgs来表示您希望传递的数据。
但是,如果您只是消耗事件而不是提高事件,那么您的选择就会受到更多限制。
由于您希望从事件中接收AsyncCompletedEventArgs,但您确实有一个选项:AsyncCompletedEventArgs的UserState指令。当您调用最终导致事件被触发的异步方法时,这是一个属性。它可以是您选择的任何对象。您在调用async方法时提供它,并且在方法调用完成时,该事件会在事件参数属性中将其返回给您。
不错,我会记得那一个。虽然希望我会想知道当我开始TonysAsynchCompletedEventArgs课程时用户的身份。 –
感谢这两种方法。我会选择这个答案,因为这种情况在我的代码中更普遍,即我只是消耗事件。 – Mika
定义EventArgs的后代
例如,
public class MySpecialEventArgs :EventArgs
{
public int theVar {get; private set;}
public MySpecialEventArgs(int argVar)
{
theVar = argVar;
}
}
然后,当你提高的情况下抛出上述之一,而不是EventArgs的
当你把你的处理程序Ë将是一个MySpecialEventArgs。
我同意这一点,但它假定你有控制代码,提高事件。 –
@AnnL更多的是先决条件而不是假设。是否有一些令人讨厌的黑客来避免它? –
这是您的事件处理程序(您是否正在调用处理程序)还是仅仅想使用具有现有事件的对象(“变量”)?也就是说,处理程序的签名可能会更好,因为['evHandler(object sender,AsyncCompletedEventArgs args)'](http://msdn.microsoft.com/zh-cn/library/db0etb8x.aspx)? – 2012-09-07 22:32:29
[传递给EventHandler的参数]的可能的重复(http://stackoverflow.com/questions/8644253/pass-parameter-to-eventhandler) – nawfal