Col*_*inE 35 c# async-await microsoft-metro
我有一些现有的代码,我移植到Windows 8 WinRT.代码从URL获取数据,异步调用传递的委托:
private void RequestData(string uri, Action<string> action)
{
var client = new WebClient();
client.DownloadStringCompleted += (s,e) => action(e.Result);
client.DownloadStringAsync(new Uri(uri));
}
Run Code Online (Sandbox Code Playgroud)
转换为WinRT需要使用HttpClient和异步方法.我已经阅读了一些关于async/await的教程,但有点困惑.如何更改上述方法,但保留方法签名以避免更改我的代码?
Col*_*ron 84
private async void RequestData(string uri, Action<string> action)
{
var client = new WebClient();
string data = await client.DownloadStringTaskAsync(uri);
action(data);
}
Run Code Online (Sandbox Code Playgroud)
请参阅:http://msdn.microsoft.com/en-us/library/hh194294.aspx
如何更改上述方法,但保留方法签名以避免更改我的代码?
最好的答案是"你没有".如果您使用async,请将其一直使用.
private async Task<string> RequestData(string uri)
{
using (var client = new HttpClient())
{
return await client.GetStringAsync(uri);
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例之后,首先使用以下方法创建异步任务,然后使用await以下命令获取其结果:
Task<string> downloadStringTask = client.DownloadStringTaskAsync(new Uri(uri));
string result = await downloadStringTask;
Run Code Online (Sandbox Code Playgroud)
var client = new WebClient();
string page = await client.DownloadStringTaskAsync("url");
Run Code Online (Sandbox Code Playgroud)
或者
var client = new HttpClient();
string page = await client.GetStringAsync("url");
Run Code Online (Sandbox Code Playgroud)