【问题标题】:WCF Completed Event is getting called multiple timesWCF Completed Event 被多次调用
【发布时间】:2016-02-08 05:57:09
【问题描述】:

我正在对 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 Button 第一次被调用时,当我点击第二次时被调用两次,第三次被调用时被调用三次,依此类推。这是一种非常不寻常的行为。为什么会发生,我该如何解决?

这里是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;
    }
}

【问题讨论】:

    标签: c# wcf methods


    【解决方案1】:

    问题出在这一行:

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

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

    其他选项是先取消注册,然后再注册。

    【讨论】:

    • 我的一位同事暗示它的名字叫Event chaining,但并没有告诉我它是什么。任何想法?是事件链吗?它是什么?
    • 是的,它的事件链作为事件被绑定多次。
    • 感谢它通过在Load 事件中调用它解决了我的问题
    【解决方案2】:

    问题就在这里。

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

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

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

    但是你应该记住一件事,这个“服务”对象在订阅事件和调用 API 时应该是相同的。

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

    【讨论】:

    • 我已经接受了一个答案 :) 反正叫Event chaining
    • 是的,我看到你已经接受了答案,但我写信是为了确保人们会读到有“相同对象”的注释(在我的答案中。我们不应该打电话它是事件链。因为事件链是故意的(不是偶然的,就像你的情况一样)。事件链是非常有用的东西,很容易理解。点击链接 [link]codeproject.com/Articles/27406/Event-Chain
    • 感谢您对事件链的澄清:)
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 2020-06-08
    • 2010-10-24
    • 2011-10-18
    • 2020-10-19
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多