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;
}
}
问题是这一行:
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