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线程。
我错过了什么重要的东西吗?还是真的这么简单?
我不明白为什么你要在后台线程上运行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呢?
似乎很容易。只检查是否所有可以处理的都被处理了