0

在我的 silverlight 应用程序中,我将一个方法传递给Repository 类GetListCallBack中另一个方法的委托参数,该方法GetEmployees将该委托作为事件处理程序附加到异步服务调用的已完成事件。

EmpViewModel 类:

public class EmpViewModel
{
  private IRepository EMPRepository = null;

  //constructor
  public EmpViewModel
  {
    this.EMPRepository= new Repository();
  }

  public void GetList()
  {
     this.EMPRepository.GetEmployees(xyz, this.GetListCallBack);

  }

  public void GetAnotherList()
  {
     this.EMPRepository.GetEmployees(pqr, this.GetAnotherListCallBack);

  }


  private void GetListCallBack(object sender, GetListCompletedEventArgs args)
  {
        if (args.Error == null)
        {
            this.collection1.Clear();
            this.collection1 = args.Result;
        }
        else
        {
            //do sth
        }
  }

  public void GetAnotherListCallback(object sender, GetListCompletedEventArgs args)
  {
     //do sth with collection1

  }

}

存储库类:

public class Repository : IRepository
{

    private readonly ServiceClient _client=null ;

    public Repository()
    {
        _client = new ServiceClient(Binding, Endpoint);
    }

    public void GetEmployees(int xyz, EventHandler<GetListCompletedEventArgs> eventHandler)
    {
        _client.GetListCompleted -= eventHandler;
        _client.GetListCompleted += new EventHandler<GetListCompletedEventArgs>(eventHandler);
        _client.GetListAsync(xyz);
    }
}

现在,当对该方法的调用GetList()完成后,如果我GetAnotherList()在同一个类中调用另一个方法EmpViewModel,那么GetListCallBack方法会在被调用之前再次GetAnotherListCallBack被调用。

这可能是因为两种方法都订阅了该事件。

如您所见,我已从回调事件中明确取消订阅事件处理程序,但事件处理程序仍在被调用。谁能建议我哪里出错了?

编辑:

当我使用局部变量而不是使用this.EMPRepository来调用该Repository方法时,它运行良好,因为两个 CallBack 方法都传递给了不同的Repository类实例,并且只有附加的 CallBack 方法被触发

public class EmpViewModel
{

 public void GetList()
 {
  EMPRepository = new Repository();
  EMPRepository.GetEmployees(xyz, this.GetListCallBack);
 }

public void GetAnotherList()
{
EMPRepository = new Repository();
EMPRepository.GetEmployees(pqr, this.GetAnotherListCallBack);
}  

--------
4

1 回答 1

1

第一的:

_client.GetListCompleted += new EventHandler<GetListCompletedEventArgs>(eventHandler);

(从功能的角度来看)与以下内容相同:

_client.GetListCompleted += eventHandler;

现在您立即看到问题所在。你的代码是:

_client.GetListCompleted -= eventHandler;
_client.GetListCompleted += eventHandler;

如果在下一行中添加事件处理程序,为什么要删除它。

我猜你想删除旧的事件处理程序并添加一个新的。所以你的函数应该得到一个委托给旧的事件处理程序来删除。像这样的东西:

public void GetEmployees(int xyz, EventHandler<GetListCompletedEventArgs> oldEventHandler, EventHandler<GetListCompletedEventArgs> newEventHandler)
{
    _client.GetListCompleted -= oldEventHandler;
    _client.GetListCompleted += newEventHandler;
    _client.GetListAsync(xyz);
}

但这可能吗?

如果您可以控制ServiceClient.GetListCompleted,为什么不删除event关键字并分配该委托,例如:

public void GetEmployees(int xyz, EventHandler<GetListCompletedEventArgs> eventHandler)
{
    _client.GetListCompleted = eventHandler;
    _client.GetListAsync(xyz);
}

或者...如果每个 GetListASync 只调用一次委托:

public void GetEmployees(int xyz, EventHandler<GetListCompletedEventArgs> eventHandler)
{
    _client.GetListCompleted += (sender, args) =>
    {
        eventHandler(sender, e); 
        _client.GetListCompleted -= eventHandler;
    };
    _client.GetListAsync(xyz);
}
于 2013-05-02T15:57:13.543 回答