Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试将参数传递给事件处理程序时,EventArgs始终具有相同的值_C#_.net_Webmethod - Fatal编程技术网

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

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

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

ie:如果我使用infoVersion的3个不同值调用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
}

哈哈,真可爱。触发的第一个事件为所有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.
}