繁体   English   中英

任务 <T> 冻结UI线程

[英]Task<T> freezing UI thread

我的代码块:

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

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

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

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

您可以在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM