Вызывает ли асинхронная функция обратного вызова событие, когда оно завершается? - PullRequest
0 голосов
/ 16 декабря 2010

Я нашел отличную страницу о том, как сделать эффективные асинхронные вызовы веб-служб с минимальными усилиями здесь:

http://www.jaylee.org/post/2010/06/22/WP7Dev-Using-the-WebClient-with-Reactive-Extensions-for-Effective-Asynchronous-Downloads.aspx

Что меня смущает, так это где я размещаю код, который я хочу выполнить после получения ответа от сервера? Система вызывает событие, когда это происходит? Простое размещение кода после вызова асинхронной загрузки не дает этой функциональности.


Я должен был быть более ясным; У меня есть этот код в моем проекте:

    private void SearchBarcode(object sender, EventArgs e)
    {
        WebClient wc = new WebClient();

        var o = Observable.FromEvent<DownloadStringCompletedEventArgs>(wc, "DownloadStringCompleted")

                          // Let's make sure that we’re on the thread pool
                          .ObserveOn(Scheduler.ThreadPool)

                          // When the event fires, just select the string and make
                          // an IObservable<string> instead
                          .Select(newString => ProcessString(newString.EventArgs.Result))

                          // Now go back to the UI Thread
                          .ObserveOn(Scheduler.Dispatcher)

                          // Subscribe to the observable, and set the label text
                          .Subscribe(s => parserInput = s);

        wc.DownloadStringAsync(new Uri("http://api.search.live.net/xml.aspx?Appid=appidhere&query=barcodenumber&sources=web"));
    }

Я не вижу, где можно разместить вызов события DownloadCompleted. SearchBarcode - это обработчик щелчка изображения; Куда уходит управление после выполнения SearchBarcode? Я хочу манипулировать значением parserInput и вызывать другую страницу xaml, передавая эти значения. Я пытался добавить void DownloadCompleted (отправитель объекта, DownloadStringCompletedEventArgs e), но он не вызывается, очевидно. Что мне здесь не хватает? (

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Вы можете поместить свой код в метод DownloadCompleted, который вызывается с результатом вашей загрузки. Помните, что любой код будет выполняться в основном потоке. Если у вас есть тяжелая обработка, я предлагаю HTTPWebRequest

1 голос
/ 16 декабря 2010

Вы можете поместить эту логику в конец обратного вызова.

В приведенном вами примере это то, что он делает с Dispatcher в DownloadCompleted.

Это пример проекта, который я написал, демонстрируяиспользование HttpWebRequest.В конце ResponseCallback вы увидите ...

Dispatcher.BeginInvoke(() => { httpWebRequestTextBlock.Text = contents; });

... для обновления пользовательского интерфейса.

Не стесняйтесь копировать этот код и использовать ваш URL.

WebClient, HttpWebRequest и поток пользовательского интерфейса на Windows Phone 7

...