我的代码块:
Dispatcher.BeginInvoke(() => {
var Users = GetUsers().Result;
// proceed...
}
private Task<List<User>> GetUsers()
{
var tcs = new TaskCompletionSource<List<User>>();
wbclient.DownloadStringCompleted += (o, e) => {
if (e.Error == null)
tcs.SetResult(JsonConvert.DeserializeObject<List<User>>(e.Result));
else
tcs.TrySetException(e.Error);
};
wbclient.DownloadStringAsync(someUri);
return tcs.Task;
}
我想在继续进行之前获取所有用户。所以我在调度程序中调用GetUser
方法。我只想等到DownloadStringCompleted
事件发生然后返回。但是使用上面的代码,UI会冻结。任何帮助表示赞赏。
注意:
我正在使用windows-phone 7
,但不支持async
await
答案 0 :(得分:3)
您应该使用延续并删除主线程中阻塞的Dispatcher.BeginInvoke调用和.Result
调用:
GetUsers().ContinueWith(t =>
{
List<User> users = t.Result;
this.TextBlock1.Text = "Complete";
}, TaskScheduler.FromCurrentSynchronizationContext());
注意我是如何在继续中使用TaskScheduler.FromCurrentSynchronizationContext()
调用来确保在主UI线程上封送此延续。
答案 1 :(得分:1)
您可以在Windows Phone 7上使用async await,只需将this nuget packet安装到解决方案中的所有项目中即可。即使某些项目与Windows Phone 8共享或某些项目是可移植类库,也能正常工作。非常有帮助。
因此,您应该可以使用:var Users = await GetUsers();
顺便说一下,你总是可以使用HttpClient而不是WebClient:http://nuget.org/packages/Microsoft.Net.Http/2.1.10