私は WCF サービスを使用して WPF アプリケーションにデータをロードしていますが、最近まで、Visual Studio が自動生成したイベント ベースの非同期メソッドを使用してロードしていました。
//Old way
private void LoadFoos(int barId)
{
serviceClient.SelectFoosByBarIdCompleted += (s, e) =>
{
Foos = e.Result.OrderBy(f => f.Description).ToList();
});
serviceClient.SelectFoosByBarIdAsync();
}
なんらかの理由で、Tasks の使用に移行しましたが、同じようなことを行う最善の方法について質問がありました。
//New way
private async void LoadFoos(int barId)
{
private TaskScheduler uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
serviceClient.SelectFoosByBarIdAsync(barId).ContinueWith(t =>
{
Foos = t.Result.OrderBy(f => f.Description).ToList();
}, uiTaskScheduler);
}
コンテキストを手動で設定する必要があるため、間違ったスレッドで更新しないようにする必要があるため、これは醜いと思います (Foos
はデータ バインドされたプロパティです)。また、私はこれを行うことができると思いました:
//New way #2, doesn't sort ;(
private async void LoadFoos(int barId)
{
private TaskScheduler uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
var selectFoosTask = serviceClient.SelectFoosByBarIdAsync(barId);
Foos = selectFoosTask;
}
しかし、それでは注文できませんDescription
。
タスクの概念全体は私にとってかなり新しいものなので、何かが足りないかもしれません。私が上にリストしたものよりも簡潔な方法はありますか?