WCF (C #), вызывающий метод Async. Помогите! - PullRequest
0 голосов
/ 22 сентября 2010

Я озадачен этим и буду признателен за любую помощь!

Я вызываю API-интерфейс Amazon с помощью WCF и сгенерированные Visual Studio -asynch- методы.

ЕстьWPF page, с кнопкой.Нажмите кнопку, и он вызывает метод поиска в другом классе.(см. код ниже)

В этом другом классе поисковика я добавляю метод AmazonItemSearchCompleted для обработки события ItemSearchCompleted.Затем я вызываю функцию асинхронного поиска из сгенерированного кода wcf.

Client.ItemSearchCompleted += AmazonItemSearchCompleted;

Client.ItemSearchAsync(itemSearch);

Кажется, все это работает нормально.Но метод AmazonItemSearchCompleted, кажется, получает удар только после того, как весь код в вызывающей форме заканчивается, т.е.хотя, когда я наступаю (независимо от того, как долго я жду ответа службы), она попадает в заключительную скобку после searchAmazon (). Но к этому времени уже слишком поздно использовать результат запроса !!

private void button1_Click(object sender, RoutedEventArgs e)
{
    searchAmazon();
} // <----- AmazonItemSearchCompleted get's hit here

private void searchAmazon()
    {
        var AzSearch = new AmazonSearch();

        var ISBNS = new List<string>();
        ISBNS.Add("0439023513");
        //ISBNS.Add("9780071374323");

        AzSearch.GetBookNameFromISBN(ISBNS[0]);
  }

Возможно, я что-то здесь упускаю, но я понятия не имею, почему событие кажетсяпоздний пожар?

Должен ли я отказаться от асинхронных методов и использовать синхронные с фоновым рабочим?(может быть, проще?)

Спасибо за любую помощь или указатели, которые вы можете предложить!

1 Ответ

2 голосов
/ 22 сентября 2010

В этом весь смысл асинхронных методов. Вы запускаете их, и код возвращается немедленно, чтобы избежать блокировки пользовательского интерфейса, пока служба не ответит. Вы используете результат только в обратном вызове успеха (AmazonItemSearchCompleted). В случае приложения WPF, если вы используете асинхронные методы, вы должны знать, что обратный вызов успеха может быть вызван в потоке, который отличается от основного потока GUI и в котором вы не должны обновлять элементы управления. Вам необходимо использовать Диспетчерский объект .

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