5

在我的应用程序中,我有多个选项卡,使用 Entity Framework 5 显示来自数据库的数据。

当我在选项卡之间切换时,我开始通过任务自动加载数据,因为我不希望 GUI 变得无响应(此任务大约需要 5-10 秒):

public async void LoadData()
{
    [...]

    await Task.Run(
        () =>
            {
                Measurements = DataContext.Measurements
                                  .Where(m => m.MeasureDate = DateTime.Today)
                                  .ToList();
            });

    [...]
}

但是当任务运行时,用户仍然可以更改到另一个选项卡,如果他这样做,我想取消 EF 查询和/或任务。

实现这一目标的最佳方法是什么?

4

2 回答 2

8

在 EF5 中,无法取消查询,因为它不接受CancellationToken. 您可以在此处阅读有关此内容的更多信息:实体框架取消长时间运行的查询

但是,EF6 确实支持它。

它具有所有方法的异步版本。因此ToList()可以改为ToListAsync()用于长时间运行的查询,并且它确实支持CancellationToken.

于 2013-08-05T13:37:24.277 回答
0
// ***Declare a System.Threading.CancellationTokenSource.
CancellationTokenSource cts;
public async void LoadData()
{
   // ***Instantiate the CancellationTokenSource.
    cts = new CancellationTokenSource();
    await Task.Run(
        () =>
            {
                Measurements = DataContext.Measurements
                                  .Where(m => m.MeasureDate = DateTime.Today)
                                  .ToList();
            }, cts);

}

    //I dont know what front end you using but in WPF for example on the tab event
    <TabControl SelectionChanged="OnSelectionChanged" ... />

private void OnSelectionChanged(Object sender, SelectionChangedEventArgs args)
{
    TabItem item = sender as TabItem; //The sender is a type of TabItem...

    if (item != null)
    {
         if (cts != null)
         {
            //This cancels the current long Running task.
            cts.Cancel();

            //call for next tab with filter LoadData(filter);
         }
    }
}

我个人的看法是。执行此操作的最佳方法是尽可能提前加载选项卡的所有数据。然后渲染视图。因此,当您在选项卡之间单击时,数据已经加载。加上调用数据库的成本只影响你一次。而不是每次单击选项卡时都往返于数据库。

于 2013-08-05T14:07:49.873 回答