【发布时间】:2016-07-25 16:45:24
【问题描述】:
我正在使用 Visual Studio 2015 和 Entity Framework 6 构建一个 MVVM Light WPF 应用程序。当用户点击 Search 按钮时,它会调用一个 RelayCommand,它在 View Model 的构造函数中是这样定义的:
SearchEmployeesRelayCommand = new RelayCommand(SearchEmployees);
View Model 中的SearchEmployees 方法如下所示:
private BackgroundWorker _worker;
public void SearchEmployees()
{
_worker = new BackgroundWorker(); // use this to show busy indicator
var dataService = new EmployeeDataService();
_worker.DoWork += (o, ea) =>
{
SearchResults = dataService.SearchEmployees(SelectedColumn, SearchValue);
};
_worker.RunWorkerCompleted += (o, ea) =>
{
IsSearching = false;
};
IsSearching = true;
_worker.RunWorkerAsync();
}
数据服务的搜索方法如下:
public ObservableCollection<EmployeeViewModel>
SearchEmployees(string selectedColumn, string searchValue)
{
var paramEmployee = Expression.Parameter(typeof(Employee), "e");
var comparison = Expression.Lambda<Func<Employee, bool>>(
Expression.Equal(
Expression.Property(paramEmployee, selectedColumn),
Expression.Constant(searchValue)),
paramEmployee).Compile();
using (var context = new MyEntities())
{
var query = (from e in context.Employees
.Where(comparison)
select new EmployeeViewModel
{
// Various EF model properties...
});
return new ObservableCollection<EmployeeViewModel>(query);
}
}
如果我尝试使用上述方法async 和awaitable,则如下:
return await new ObservableCollection<EmployeeViewModel>(query);
它给出了这个错误:
“ObservableCollection”不包含“GetAwaiter”的定义,并且找不到接受“ObservableCollection”类型的第一个参数的扩展方法“GetAwaiter”(您是否缺少 using 指令或程序集引用?)
如果搜索async 返回ObservableCollection,您如何进行搜索?谢谢。
更新:为了让忙碌指示器工作,我必须做出这样的改变:
_worker.DoWork += async (o, ea) =>
{
SearchResults = await dataService
.SearchEmployees(selectedColumnValue, SearchValue);
IsSearching = false;
};
我完全删除了_worker.RunWorkerCompleted 块。可能有更好的方法来做到这一点,但这就是我的工作方式。
【问题讨论】:
标签: c# wpf asynchronous mvvm async-await