私はアプリに取り組んでおり、すべての優れたベストプラクティスを実行しようとしています。これが私がやりたいことをしないコードです:
async public Task DoStuff()
{
DispatcherAdapter.Current.BeginInvoke(() => { myObject.SomeProperty = "new value"; });
await DatabaseAdapter.Current.SaveItem(TableName, myObject);
}
上記のコードは、更新されたプロパティ値でアイテムをデータベースに保存しません。これは、待機している非同期メソッドが機能する前に BeginInvoke() が必ずしも終了しないためだと思います。DispatcherAdapter は、次のようにバックグラウンドで Deployment.Current.Dispatcher を使用するだけです。
public override void BeginInvoke(Action a)
{
Deployment.Current.Dispatcher.BeginInvoke(a);
}
ここに私が調べたものがありますが、うまくいきません:
- BeginInvoke() 呼び出しの待機中 - Task が返されないため機能せず、Dispatcher.BeginInvoke が実際にいつ終了したかがわからない状態にドリルダウンします
- BeginInvoke() から返された DispatcherOperation オブジェクトを操作しようとしています- 通常の .NET で利用できる Completed イベントは Windows Phone 8 では利用できません
SynchronizationContext.Send() の使用- DispatcherSynchronizationContext.Current は常に null であるため、機能しません...以下の無関係なコードを参照してください。
public async override Task Invoke(Action a) { await Task.Factory.StartNew(() => { DispatcherSynchronizationContext.Current.Send(new SendOrPostCallback(delegate { a.Invoke(); }), null); }); }
基本的に、無効なクロススレッド アクセスを回避し、Windows Phone 8 の非同期メソッド内でコードが特定の順序で実行されるようにするにはどうすればよいですか? 私は .SaveItem を移動して BeginInvoke 内に移動できると思います...しかし、それは抜け道のように感じます.BeginInvoke呼び出しを待つことはできません(非同期メソッドに入れるのはかなり無意味です)。私が何をすべきかを知ることができてうれしい/この状況で他の人がやったこと.