WCF 已完成事件被多次调用

本文关键字:调用 已完成 事件 WCF | 更新日期: 2023-09-27 18:33:34

我正在对 wcf 服务方法进行asynchronous调用,并在单击Button时生成了一个Completed事件:

private void OnSearchProductClick(object sender, RoutedEventArgs e)
{
    service.GetProductsCompleted += new EventHandler<GetProductsCompletedEventArgs>(webService_GetProductsCompleted);
    ProductType productType = (ProductType)cboProductType.SelectedItem;
    _productTypeID = productType.ProductTypeID;
    service.GetProductsAsync(txtName.Text, txtCode.Text, _productTypeID);
}

问题是,webService_GetProductsCompleted事件被多次调用。第一次click按钮时,它被调用一次,当我第二次单击时被调用两次,当第三次单击被调用三次时,依此类推。这是一种非常不寻常的行为。为什么会发生这种情况,我该如何解决?

以下是webService_GetProductsCompleted事件:

public void webService_GetProductsCompleted(object sender, CatalogueServiceReference.GetProductsCompletedEventArgs e)
{
    if (e.Result.Count != 0)
    {
        PagedCollectionView pagingCollection = new PagedCollectionView(e.Result);
        pgrProductGrids.Source = pagingCollection;
        grdProductGrid.ItemsSource = pagingCollection;
        pgrProductGrids.Visibility = Visibility.Visible;
    }
}

WCF 已完成事件被多次调用

问题是这一行:

service.GetProductsCompleted += new EventHandler<GetProductsCompletedEventArgs>(webService_GetProductsCompleted);

您应该从 Load 事件窗体调用它,而不是在此处。因为每次调用这些方法 (OnSearchProductClick) 时,您都会再次添加相同的处理程序,以便多次执行。

另一种选择是先取消注册,然后再次注册。

问题就在这里。

    private void OnSearchProductClick(object sender, RoutedEventArgs e)
    {
        service.GetProductsCompleted += new EventHandler<GetProductsCompletedEventArgs>(webService_GetProductsCompleted);
    }

通过这样做,您是在点击事件中订阅事件,因此每次点击您都在进行新的订阅。

取而代之的是,您应该订阅一次服务的事件(在此单击事件之前,通常是表单的加载事件或根据您的说服在构造函数中)。

但您应该记住的一件事是,在订阅事件和调用 API 时,此"服务"对象应该是相同的。

以下链接可能会清除这个想法https://msdn.microsoft.com/en-us/library/ms366768.aspx