【发布时间】:2013-08-07 09:57:55
【问题描述】:
这是this question 的后续问题。
我正在尝试从我的数据库中加载数据,这需要 5-10 秒,但我希望 GUI 保持响应,并且它应该可以取消。
private CancellationTokenSource _source;
public IEnumerable<Measurement> Measurements { get { ... } set { ... } }
private async void LoadData()
{
_source = new CancellationTokenSource();
using (var context = new TraceContext())
{
Measurements = null;
Measurements = await context.Measurements.ToListAsync(_source.Token);
}
}
private void Cancel()
{
if (_source != null)
_source.Cancel();
}
public RelayCommand ReloadCommand
{
get { return _reloadCommand ?? (_reloadCommand = new RelayCommand(Reload)); }
}
private RelayCommand _reloadCommand;
public RelayCommand CancelCommand
{
get { return _cancelCommand ?? (_cancelCommand = new RelayCommand(Cancel)); }
}
private RelayCommand _cancelCommand;
我已经尝试了一些事情,但我无法让它正常工作,这只是加载列表,仅此而已,我无法取消它。
这其中的错误在哪里?
【问题讨论】:
-
当您说“我无法取消”时,当您告诉
CancellationTokenSource取消时,实际会发生什么? -
什么都没有发生,据我所知,如果仍有使用此令牌运行的任务,它应该抛出异常,但这不会发生。
-
什么是
ToListAsync?通过一些谷歌搜索,我找不到它作为 MSDN 或其他东西的一部分。也许你写了它并且它包含一个错误,所以令牌没有被正确应用? -
这不是取消的工作方式。仅当尝试对任务进行
Wait()或观察任务的结果时,已取消的任务(已转换为Cancelled状态的Task)引发异常。在这种情况下,任务由 EF 控制,并且只有在 EF 选择时才会转换到该状态。在不知道他们的内部细节的情况下,测试版可能不会这样做。 -
@TimS。这是新的 EF6 功能的一部分 msdn.microsoft.com/en-us/data/jj819165.aspx 编辑:goo.gl/kMR5D 可能是更好的来源
标签: c# .net wpf entity-framework entity-framework-6