【发布时间】:2018-08-22 19:56:22
【问题描述】:
我有一个从 SQLite 数据库获取一些数据的应用程序。例如,我有一个类似下面的方法:
public async Task<IEnumerable<TaskItem>> GetAllAsync()
{
using (var context = new NotesContext())
{
try
{
return await context
.Tasks
.ToListAsync();
}
catch (Exception)
{
return Enumerable.Empty<TaskItem>();
}
}
}
我从页面加载时绑定的命令调用此方法:
LoadedCommand = new RelayCommand<TaskItemViewModel>
((task) => GetAllTasksAsync(task));
以及命令调用的方法:
public async void GetAllTasksAsync(TaskListItemViewModel taskList)
{
ShowTaskListViewProgressRing = true;
Tasks.Clear();
TaskAutoSuggestBoxItems.Clear();
var response = await _dataService
.TaskService
.GetAllAsync()
.ConfigureAwait(false);
var tasks = _mapper.Map<List<TaskItemViewModel>>(response);
if (tasks.Count > 0)
{
var mainTasks = tasks
.Where(t => t.ParentTask == null);
mainTasks.ForEach(t =>
{
if (!tasks.Any(st => st.ParentTask == t.TaskID))
return;
t.SubTasks = new ObservableCollection<TaskItemViewModel>(
tasks
.Where(st => st.ParentTask == t.TaskID)
.OrderBy(st => st.Position));
});
Tasks.AddRange(mainTasks);
TaskAutoSuggestBoxItems
.AddRange(_mapper.Map<IEnumerable<ItemModel>>(mainTasks.OrderBy(t => t.Title)));
}
CurrentTaskList = taskList;
ShowTaskListViewProgressRing = false;
}
如果我没记错的话,GetAllTasksAsync 会被 UI 线程调用,但是当它到达 GetAllAsync().ConfigureAwait(false) 时,它会退出其上下文,然后 GetAllAsync 在线程池上下文中运行,当它完成时它会退出返回 UI 线程并更新视图属性。
这种方法正确吗?
【问题讨论】:
-
TaskAutoSuggestBoxItems是 UI 控件吗? -
@JohanP 是绑定到 AutoSuggestBox 的
ItemsSource的ObservableCollectionproperty -
如果您不触摸
GetAllTasksAsync内的任何 UI 控件,那么使用configureAwait(false);就可以了,否则您将由于上下文未被捕获而导致异常,并且继续将在线程池线程。 -
@JohanP by ui 控件在此上下文中是否可以绑定属性?如果那是正确的
Tasks和TaskAutoSuggestBoxItems绑定到视图,那么应用程序应该崩溃吧? -
源属性与 UI target 属性不同。您不能从后台线程触摸控件,但可以设置视图模型的源属性。
标签: c# .net uwp async-await