您的位置:首页 > 理论基础 > 计算机网络

WP7 HttpWebRequest跨线程异步更新界面UI

2012-04-20 22:33 246 查看
using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using Microsoft.Phone.Controls;

using System.IO;

namespace WebClientHttpWebRequest

{

  public partial class MainPage : PhoneApplicationPage

  {

    // Constructor

    public MainPage()

    {

      InitializeComponent();

    }

    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)

    {

      DoWebClient();

      DoHttpWebRequest();

    }

    private void DoWebClient()

    {

      var webClient = new WebClient();

      webClient.OpenReadAsync(new Uri("http://www.bing.com"));

      webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);

    }

    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

    {

      using (var reader = new StreamReader(e.Result))

      {

        webClientTextBlock.Text = reader.ReadToEnd(); 

      }

    }

    private void DoHttpWebRequest()

    {

      string url = "http://www.bing.com";

      var request = HttpWebRequest.Create(url);

      var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request);

    }

    private void ResponseCallback(IAsyncResult result)

    {

      var request = (HttpWebRequest)result.AsyncState;

      var response = request.EndGetResponse(result);

      using (var stream = response.GetResponseStream())

      using (var reader = new StreamReader(stream))

      {

        // FAIL - httpWebRequestTextBlock.Text = reader.ReadToEnd(); //UnauthorizedAccessException was Unhandled - Invalid cross-thread access.

        // FAIL - Dispatcher.BeginInvoke(() => { httpWebRequestTextBlock.Text = reader.ReadToEnd(); }); //ObjectDisposedException unhandled - Cannot read from a closed TextReader.

        var contents = reader.ReadToEnd();

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

      }

    }

  }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息