Windows Phone BackgroundWorker for WebClient?

本文关键字:WebClient for BackgroundWorker Phone Windows | 更新日期: 2023-09-27 18:08:02

现在WebClient的问题是固定的,可以返回一个后台线程,我想开始使用它以这种方式

经过多次搜索,我已经提出了这段代码,似乎工作得很好,这是所有有它吗?

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s,e) =>
{
    WebClient wc = new WebClient();
    wc.DownloadStringCompleted += DownloadStringCompleted;
    wc.DownloadStringAsync(url);
};
bw.RunWorkerAsync();

在DownloadStringCompleted中,我将结果发送回UI线程。

我错过了什么重要的东西吗?还是真的这么简单?

Windows Phone BackgroundWorker for WebClient?

我不明白为什么你要在后台线程上运行WebClient,因为WebClient已经为下载部分创建了一个线程。

不同之处在于WebClient在UI线程上运行它的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);
    }
}

我提到的问题是,在7.0 WebClient 总是返回UI线程,不管它是在哪里创建的,潜在地使UI无响应。

在WP SDK 7.1 WebClient将返回创建它的线程,所以如果它是从后台线程创建的DownloadStringCompleted 现在返回后台线程。

如果你测试我的例子没有封送响应,你会看到一个无效的跨线程异常。

在我看来,除非你有理由不使用,为什么现在不使用WebClient呢?

似乎很容易。只检查是否所有可以处理的都被处理了