Windows Phone BackgroundWorker для веб-клиента? - PullRequest
4 голосов
/ 10 сентября 2011

Теперь проблема с WebClient исправлена ​​и может вернуться в фоновом потоке, который я хотел бы начать использовать таким образом.

После долгих поисков я пришел к этому коду, который, кажется, работает нормально, это все, что нужно?

BackgroundWorker bw = new BackgroundWorker();

bw.DoWork += (s,e) =>
{
    WebClient wc = new WebClient();

    wc.DownloadStringCompleted += DownloadStringCompleted;
    wc.DownloadStringAsync(url);
};

bw.RunWorkerAsync();

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

Я что-то упустил или действительно так просто?

Ответы [ 3 ]

5 голосов
/ 10 сентября 2011

Я не понимаю, зачем вам сначала запускать WebClient в фоновом потоке, поскольку WebClient уже создает поток для загружаемой части.

Разницав том, что WebClient запускает событие DownloadStringCompleted в потоке пользовательского интерфейса.Что это все равно будет делать в вашем коде.

Я бы посоветовал вам использовать класс WebRequest.Использование класса WebRequest может быть значительно упрощено с помощью простого метода расширения, который заставляет его вести себя как WebClient.

public static class WebRequestEx
{
    public static void DownloadStringAsync(this WebRequest request, Action<string> callback)
    {
        if (request == null)
            throw new ArgumentNullException("request");

        if (callback == null)
            throw new ArgumentNullException("callback");

        request.BeginGetResponse((IAsyncResult result) =>
        {
            try
            {
                var response = request.EndGetResponse(result);
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    callback(reader.ReadToEnd());
                }
            }
            catch (WebException e)
            {
                // Don't perform a callback, as this error is mostly due to
                // there being no internet connection available. 
                System.Diagnostics.Debug.WriteLine(e.Message);
            }
        }, request);
    }
}
3 голосов
/ 10 сентября 2011

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

В WP SDK 7.1 WebClientвернется к потоку, из которого он был создан, поэтому, если он создан из фонового потока, DownloadStringCompleted будет , теперь вернется к фоновому потоку.

Если вы тестируете мой пример без маршалинга ответа, который выувидит Invalid Cross Thread Exception.

Мне кажется, если у вас нет причин не делать этого, почему бы не использовать WebClient сейчас?

0 голосов
/ 10 сентября 2011

Кажется, это легко.Проверяйте, только ли все, что может быть утилизировано, утилизируется.

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