2016-02-08 4 views
1

Я сделав asynchronous вызов методов службы WCF и вызвал Completed событие на Button мыши:WCF завершенного событие вызывалось несколько раз

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; 
    } 
} 

ответ

2

Проблема эта линия:

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

Вы должны вызвать из события загрузки формы, а не здесь. Поскольку каждый раз, когда вы вызываете эти методы (OnSearchProductClick), вы снова добавляете тот же обработчик, чтобы он выполнялся несколько раз.

Другой вариант - сначала зарегистрировать его, а затем зарегистрировать его снова.

+0

Один из моих коллег намекал его называют 'chaining' событие, но не был достаточно любезен, чтобы сказать, что это. Есть идеи? Это цепочка событий? И что это? –

+0

Да, его цепочка событий как событие получает связывание несколько раз. – prashant

+0

Спасибо, что решил мою проблему, вызвав его в событии 'Load' –

0

проблема есть здесь.

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

Посредством этого вы подписываетесь на событие события click, таким образом, при каждом нажатии вы делаете новую подписку.

Вместо этого вы должны подписывать событие службы один раз (перед этим событием клика, обычно в случае загрузки формы или конструктора в соответствии с вашим убеждением).

Но одно, что вы должны иметь в виду, этот «сервисный» объект должен быть одинаковым во время подписки на событие и вызова API.

Следующая ссылка может очистить эту идею https://msdn.microsoft.com/en-us/library/ms366768.aspx

+0

Я уже принял ответ :) Во всяком случае, это называется' Event chaining'? –

+0

Да, я видел, что вы приняли ответ, но я написал для ответа, чтобы убедиться, что люди прочитают записку о том, что у него «тот же объект» (что есть в моем ответе). И мы не должны называть его цепочкой событий. (не случайно, как это было в вашем случае). Цепочка событий очень полезна и понятна. Перейдите по ссылке [link] http://www.codeproject.com/Articles/27406/Event-Chain – Amit

+0

Спасибо для уточнения по цепочке событий :) –