есть ли способ реализовать следующий метод, такой, который is вызывается вовремя?

#c# #wcf

#c# #wcf

Вопрос:

Теперь у меня есть следующий код, который вызывает службу WCF, получает некоторые данные и затем передает их в браузер.

Единственная проблема заключается в том, что client_GetProductCompleted() не вызывается до завершения Load(), а к тому времени уже слишком поздно. Браузер уже загрузил информацию.

Итак, в основном я спрашиваю, есть ли способ реализации методов, такой, чтобы client_GetProductCompleted() вызывался сразу после вызова Load(), тогда он может вовремя возвращать данные обратно в браузер 🙂

Возможно, это глупо, но я пытался перевести программу в спящий режим в ожидании завершения Load(), и это не сработало. Так что сейчас я совершенно невежественен…

 public static Products _OurProducts = new Products();

public void Load()
{
    ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();
    client.getProductsCompleted  = 
        new EventHandler<ServiceReference1.getProductsCompletedEventArgs>(
            client_GetProductCompleted);

    client.getProductsAsync();    
    return;
}

void client_GetProductCompleted(object sender, ServiceReference1.getProductsCompletedEventArgs e)
{
    if (e.Result != null)
    {
        ObservableCollection<ServiceReference1.Product> products = e.Resu<
        foreach (ServiceReference1.Product prod in products)
        {
            Product temp = new Product(prod);
            _OurProducts.Add(temp);
        }
     }
}
  

Комментарии:

1. Метод? methodB? похоже, что в вашем примере их нет

2. Где находится methodA и methodB ? И когда Load вызывается?

3. О, извините, я изменю это, я имел в виду методы Load() и client_GetProductCompleted().

Ответ №1:

Это не совсем понятно, но я подозреваю, что вы хотите MethodA заблокировать, пока обработчик не завершит выполнение (предположительно, в другом потоке).

Возможно, что объект, к которому вы обращаетесь, предлагает синхронный способ возврата своих результатов. Это определенно был бы правильный путь, если бы он был доступен.

Если нет, вы можете заблокировать метод до тех пор, пока не будет подан сигнал, например, с помощью ManualResetEvent .

Например.:

 var resetEvent = new ManualResetEvent(false);
client.getProductsCompleted  = (s, e) => 
                               { 
                                   client_GetProductCompleted(s, e); 
                                   resetEvent.Set();
                               };    
client.getProductsAsync(); 
resetEvent.WaitOne();
  

Комментарии:

1. Привет, большое спасибо. Да, я понял, что oberservableCollections может автоматически запускать события при обновлении, поэтому мне просто нужно прослушать событие и сообщить браузеру обновить событие, когда данные были обновлены 🙂