私は非同期プログラミングと WP8 を初めて使用します。これは私の最初のアプリであり、Dispatcher.BeginInvoke(..) に問題があります。
ビュー クラスの背後にある私のコードでは、2 番目のタブの Pivot scree async にデータをロードしようとしています。
ここに私が今持っているものがあります:
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 スレッドをブロックしていることです。ここで何が欠けていますか?
編集: アイデアは、XAML で ModelBinded である ViewModel ObservableCollection にデータを非同期にロードすることです。
Task.Factory(...) などを使用して別のスレッドで呼び出しを非同期にしようとすると、UI スレッドではなく別のスレッドからバインディングを変更しているため、クラッシュします。