使用WebClient将标准应用程序转换为WP8

本文关键字:程序转换 WP8 应用 标准 WebClient 使用 | 更新日期: 2023-09-27 17:49:22

我有一个应用程序做了很多调用,比如

string html = getStringFromWeb(url);
//rest of processes use the html string

我正在尝试将应用程序移植到Windows Phone上,那里的方法似乎完全不同:

void perform asynch call (...)
void handler
{ string html = e.Result
  //do things with it
}
  1. 是从网页获取html只能使用这种异步方法?
  2. 我如何重新利用代码,以便我可以用html工作时,我调用它?

使用WebClient将标准应用程序转换为WP8

异步方法返回一个Task。如果不使用Wait(),代码将继续执行异步方法。如果您不想使用Wait(),您可以创建一个以Callback -method为参数的异步方法。

等():

// Asynchronous download method that gets a String
public async Task<string> DownloadString(Uri uri) {
   var task = new TaskCompletionSource<string>();
   try {
      var client = new WebClient();
      client.DownloadStringCompleted += (s, e) => {
         task.SetResult(e.Result);
   };
   client.DownloadStringAsync(uri);
   } catch (Exception ex) {
      task.SetException(ex);
   }
   return await task.Task;
}
private void TestMethod() {
   // Start a new download task asynchronously
   var task = DownloadString(new Uri("http://mywebsite.com"));
   // Wait for the result
   task.Wait();
   // Read the result
   String resultString = task.Result;
}

Or with Callback:

private void TestMethodCallback() {
   // Start a new download task asynchronously
   DownloadString(new Uri("http://mywebsite.com"), (resultString) => {
      // This code inside will be run after asynchronous downloading
      MessageBox.Show(resultString);
   });
   // The code will continue to run here
}
// Downlaod example with Callback-method
public async void DownloadString(Uri uri, Action<String> callback) {
   var client = new WebClient();
   client.DownloadStringCompleted += (s, e) => {
      callback(e.Result);
   };
   client.DownloadStringAsync(uri);
}

当然我建议使用回调方式,因为它不会阻止代码运行,而它下载String

当你在为web请求工作时,请使用HttpWebRequest。

在windows phone 8 xaml/runtime中,您可以通过使用HttpWebRequest或WebClient来实现。

WebClient基本上是HttpWebRequest的包装器。

如果你有一个小的请求,然后使用HttpWebRequest。它是这样的

HttpWebRequest request = HttpWebRequest.Create(requestURI) as HttpWebRequest;
WebResponse response = await request.GetResponseAsync();
ObservableCollection<string> statusCollection = new ObservableCollection<string>();
using (var reader = new StreamReader(response.GetResponseStream()))
{
    string responseContent = reader.ReadToEnd();
    // Do anything with you content. Convert it to xml, json or anything.
}

你可以在一个基本上是异步方法的函数中实现。

回到第一个问题,所有的web请求都将作为异步调用进行,因为基于你的网络需要时间来下载。为了使应用程序不冻结,将使用一个async方法。