尝试将参数传递给事件处理程序时,EventArgs始终具有相同的值

时间:2014-11-09 15:27:25

标签: c# .net webmethod

我想将参数传递给Web方法的事件处理程序。我添加了一个自动取消订阅逻辑,以避免事件处理程序多次被触发。问题是我总是在事件处理方法中获得相同的EventArgs对象实例。

ie:如果我使用3个不同的值为infoVersion调用GetInfo 3次,事件处理函数会被触发3次,但我将始终获得变量e的相同实例。

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
}

编辑:网络方法已经过测试并且运行正常。如果我修改了infoVersion值,e.result将会改变。

如果我使用下面更简单的方法,e.result每次都会有所不同:

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.
}

1 个答案:

答案 0 :(得分:1)

哈哈,这是一个可爱的人。触发的第一个事件会调用所有3个调用的处理程序并删除它们的事件注册,这会使其他事件无法到达。

要解决此问题,您可以为每个调用创建一个客户端,以便事件不会相互交叉。

更好的解决方案是使用异步API来接收每次调用的回调。如果这是一个自动生成的代理类,您可以使它生成这些方法。

注意:这需要.Net 4.5

enter image description here

相关问题