繁体   English   中英

EF 5:如何在异步任务中取消长运行查询

[英]EF 5: How to cancel a longrunning query in a async Task

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

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

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

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

    [...]
}

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

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

在EF5中,无法取消查询,因为它不接受CancellationToken 你可以在这里阅读更多相关内容: 实体框架取消长时间运行的查询

但是,EF6确实支持它。

它具有所有方法的异步版本。 因此,对于长时间运行的查询, ToList()可能是ToListAsync() ,它确实支持CancellationToken

// ***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);
         }
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM