使用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
}
- 是从网页获取html只能使用这种异步方法?
- 我如何重新利用代码,以便我可以用html工作时,我调用它?
异步方法返回一个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方法。