使用WebClient的Silverlight背景线程

时间:2010-12-01 17:06:42

标签: multithreading silverlight windows-phone-7 webclient

我正在使用WebClient从我的网络服务异步获取信息:

    wc.DownloadStringCompleted += DownloadStringCompleted;
    wc.DownloadStringAsync(service);

我工作正常,但我认为DownloadStringCompleted方法正在处理UI线程,因为我在那里进行了大量的解析,我的页面需要几秒钟才会出现。但是,由于我有如此固定的数据和进度条,我不介意它立刻出现。

我怎么能这样做?

谢谢!

3 个答案:

答案 0 :(得分:2)

使用HttpWebRequest而不是WebClient。 HWR不会在UI线程上返回,因此不会阻止它更新。

答案 1 :(得分:1)

WebClient确实在UI线程上返回,所以是的,您的解析将阻止UI。出于性能原因,您使用HttpWebRequest代替recommended

使用HttpWebReques t你的事件将在后台线程上触发,这样你就可以进行所需的所有处理,但是你会遇到将结果封送回UI线程的问题,这样你就可以更新UI (否则您将看到跨线程违规异常)。您可以使用Dispatcher使用以下方法将结果封送回UI:

private void UpdateUI(Results results)
{
    if (!Deployment.Current.Dispatcher.CheckAccess())
        Deployment.Current.Dispatcher.BeginInvoke(() => UpdateUI(results));
    else
    {
        //Update the UI
    {
}

答案 2 :(得分:0)

在Mango中,WebClient已更改,以便

wc.DownloadStringAsync(service);

从后台线程调用响应也来到后台线程。您可以使用BackgroundWorker来实现此目的。