我是异步编程和 WP8 的新手,这是我的第一个应用程序,但 Dispatcher.BeginInvoke(..)
在视图类后面的代码中,我试图在第二个选项卡的 Pivot scree 异步中加载数据。
这是我现在拥有的:
public partial class ReminderPivot : PhoneApplicationPage
{
#region Reminder Members
private ReminderViewModel _model;
private IRepository _repository;
#endregion Reminder Members
#region Constructors
public ReminderPivot()
{
InitializeComponent();
_model = new ReminderViewModel();
_repository = new LocalStorageRepository();
LoadData();
LoadAsyncData();
this.DataContext = _model;
}
#endregion Constructors
public void LoadData()
{
IEnumerable<Reminder> activeList = _repository.GetRemindersByStatusId(2);
if (activeList != null)
{
foreach (var reminder in activeList)
{
_model.ActiveReminders.Add(reminder);
}
}
}
public void LoadAsyncData()
{
Action action = () =>
{
Thread.Sleep(5000);
IEnumerable<Reminder> inactiveList = _repository.GetRemindersByStatusId(3);
if (inactiveList != null)
{
_model.InctiveReminders = new System.Collections.ObjectModel.ObservableCollection<Reminder>(inactiveList);
}
};
Dispatcher.BeginInvoke(action);
}
问题是这仍然阻塞了我的 UI 线程。我在这里想念什么?
编辑:想法是将数据异步加载到 ViewModel ObservableCollection 中,它是 XAML 中的 ModelBinded。
如果我尝试使用 Task.Factory(...) 等在另一个线程上进行异步调用,那么这会崩溃,因为我正在从另一个线程而不是 UI 线程更改绑定。