4

我想让数据不会在ui线程中加载,而是在后台线程中加载。 我尝试了几个谷歌的例子,但它仍然无法正常工作。多线程windows phone应用程序

ThreadPool.QueueUserWorkItem((o) => 
{ 
    IList<Asana> asanasRepo = null; 
    var asanasRepository = this.GetService<IAsanasRepository>(); 
    asanasRepo = asanasRepository.GetAllAsanas(); 

    Asanas = asanasRepo.Select(x => new AsanasListItemViewModel 
    { 
     AsanaId = x.AsanaId, 
     AsanaLevel = InfrastructureHelper.GetLevel(x.AsanaLevel), 
     CoverImagePath = string.Format("/Content/Images/{0}", x.CoverImageFileName), 
     UsualAsanaTitle = x.UsualTitle, 
     YogaAsanaTitle = x.YogaTitle 
    }).ToObservableCollection(); 

    asanasDispatcher.BeginInvoke(() => 
    { 
     AsanasItems.Clear(); 
     AsanasItems = (from asana in Asanas 
         group asana by asana.AsanaLevel into c 
         orderby c.Key 
         select new Group<AsanasListItemViewModel>(c.Key, c) 
        ).ToObservableCollection(); 
    }); 
}); 

的主要思路是从数据库不是在UI线程LO负载数据,但在后台,当数据将被载入它呈现到用户界面。 我试过类似上面的代码,但它不工作。 你能帮我吗? 谢谢!

+0

什么是失败?它给你什么错误?什么线? –

+0

没有错误,只是未在UI上呈现的项目列表。 – Alex

+0

你确定你的绑定能用一个更简单的例子吗?另外,尝试并在UI线程上运行代码(即ThreadPool中没有)? –

回答

3

尝试初始化AsanasItems在构造函数中,并在你的代码所示没有一个新的集合分配给它一个空ObervableCollection<..>,只需使用AsanasItems.Add(..)一个添加的项目之一。

如果它不起作用,你需要提供一个最小的工作样本,任何人都可以帮助你。

+0

同意..'AsanasItems.Add()'是必需的。 OP正在创造新的收藏。 – YK1

+0

@ YK1它不是必需的,只要类实现INotifyPropertyChanged –

+0

@KooKiz:是的,你也同意 - 但假设'AsanasItems'包含类实现'INotifyPropertyChanged'并且'AsanasItems'确实是一个属性。但我们不知道。我认为OP必须澄清。 – YK1

相关问题