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

相關問題