2

我的代码块:

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事件发生然后返回。但是使用上面的代码,用户界面会冻结。任何帮助表示赞赏。

笔记:

我正在使用windows-phone 7,不支持async await

4

2 回答 2

3

您应该使用延续并删除 Dispatcher.BeginInvoke 调用和.Result主线程中阻塞的调用:

GetUsers().ContinueWith(t => 
{
    List<User> users = t.Result;
    this.TextBlock1.Text = "Complete"; 
}, TaskScheduler.FromCurrentSynchronizationContext());

请注意我如何TaskScheduler.FromCurrentSynchronizationContext()在延续中使用调用来确保在主 UI 线程上编组此延续。

于 2013-06-22T10:23:21.650 回答
1

您可以在 Windows Phone 7 上使用 async await,您只需将此 nuget 数据包安装到解决方案中的所有项目。即使某些项目与 Windows Phone 8 共享或某些项目是可移植类库,也能完美运行。非常有帮助。

所以你应该能够使用:var Users = await GetUsers();

顺便说一句,你总是可以使用 HttpClient 而不是 WebClient : http: //nuget.org/packages/Microsoft.Net.Http/2.1.10

于 2013-06-22T11:04:46.797 回答