C# 尝试将参数传递给事件处理程序时,EventArgs始终具有相同的值
我想将参数传递给web方法的事件处理程序。我添加了一个自动取消订阅逻辑,以避免事件处理程序被多次触发。问题是,我总是在事件处理方法中获得相同的EventArgs对象实例 ie:如果我使用infoVersion的3个不同值调用GetInfo 3次,事件处理函数将被触发3次,但我将始终得到变量e的相同实例C# 尝试将参数传递给事件处理程序时,EventArgs始终具有相同的值,c#,.net,webmethod,C#,.net,Webmethod,我想将参数传递给web方法的事件处理程序。我添加了一个自动取消订阅逻辑,以避免事件处理程序被多次触发。问题是,我总是在事件处理方法中获得相同的EventArgs对象实例 ie:如果我使用infoVersion的3个不同值调用GetInfo 3次,事件处理函数将被触发3次,但我将始终得到变量e的相同实例 public void GetInfo(int infoVersion) { System.EventHandler<ServiceReference.getInfoComple
public void GetInfo(int infoVersion)
{
System.EventHandler<ServiceReference.getInfoCompletedEventArgs> handler = null;
handler = (sender, e) =>
{
client.getInfoCompleted -= handler;
client_getInfoCompleted(sender, e, infoVersion);
};
client.getInfoCompleted += handler;
client.getInfoAsync(infoVersion);
}
void client_getInfoCompleted(object sender, ServiceReference.getInfoCompletedEventArgs e, int infoVersion)
{
//do something with e.result and infoVersion
//e.result is always the same but infoVersion is correct
}
哈哈,真可爱。触发的第一个事件为所有3个调用调用调用处理程序并删除它们的事件注册,这使得其他调用无法到达 要解决这个问题,您可以为每个调用创建一个客户端,这样事件就不会相互交叉 更好的解决方案是使用异步API,该API将为每个调用接收回调。如果这是一个自动生成的代理类,您可以让它生成这些类型的方法 注意:这需要.NET4.5
因此请求数据(infoVersion)总是正确的。您确定不同版本的结果应该不同吗?你测试过了吗?为什么不呢?这里真正重要的代码当然是触发事件的代码。没有规定不允许使用同一个对象。你有权访问触发事件的代码吗?你有3个飞行中呼叫,还是它们不重叠?@mikez这三个呼叫是在同一时间。这3个响应稍后到达,只有在第一次调用getInfoCompleted时e才匹配infoVersion值。谢谢,它回答了这个问题。但是,“生成基于任务的操作”选项在Framework 4.0中不可用。我不得不将目标框架更改为4.5.Yep,这是一个重要的注意事项。基于async await的api应该更加甜美,并且不容易出现内存泄漏。
public void GetInfo(int infoVersion)
{
client.getInfoCompleted += client_getInfoCompleted;
client.getInfoAsync(infoVersion);
}
void client_getInfoCompleted(object sender, ServiceReference.getInfoCompletedEventArgs e)
{
//e.result has a different value each time.
}