我正在使用 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();
}
无论出于何种原因,我们开始使用任务,我对做同样事情的最佳方式有疑问:
//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
.
整个任务概念对我来说相当新,所以也许我遗漏了一些东西。有没有比我上面列出的更简洁的方法?