Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF 5:如何在异步任务中取消长时间运行的查询_C#_.net_Wpf_Entity Framework - Fatal编程技术网

C# EF 5:如何在异步任务中取消长时间运行的查询

C# EF 5:如何在异步任务中取消长时间运行的查询,c#,.net,wpf,entity-framework,C#,.net,Wpf,Entity Framework,在我的应用程序中,我有多个选项卡,用Entity Framework 5显示数据库中的数据 当我在选项卡之间切换时,我开始通过任务自动加载数据,因为我不希望GUI没有响应(此任务大约需要5-10秒): 但是当任务运行时,用户仍然可以切换到另一个选项卡,如果他这样做了,我想取消EF查询和/或任务 实现这一点的最佳方法是什么?在EF5中,没有办法取消查询,因为它不接受CancellationToken。您可以在此处阅读更多关于此的信息: 然而,EF6确实支持它 它具有所有方法的异步版本。因此,对于长

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

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

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


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

在EF5中,没有办法取消查询,因为它不接受
CancellationToken
。您可以在此处阅读更多关于此的信息:

然而,EF6确实支持它

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

/***声明System.Threading.CancellationTokenSource。
// ***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);
         }
    }
}
取消源cts; 公共异步void LoadData() { //***实例化CancellationTokenSource。 cts=新的CancellationTokenSource(); 等待任务。运行( () => { 度量=DataContext.Measurements .Where(m=>m.MeasureDate=DateTime.Today) .ToList(); },cts); } //我不知道您使用的是什么前端,但在WPF中,例如在tab事件中 SelectionChanged上的私有void(对象发送方,SelectionChangedEventArgs参数) { TabItem item=发件人作为TabItem;//发件人是TabItem的一种类型。。。 如果(项!=null) { 如果(cts!=null) { //这将取消当前长时间运行的任务。 cts.Cancel(); //调用下一个带有filter LoadData的选项卡(filter); } } }

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

关于EF6什么时候发布有消息吗?我已经多次考虑过使用它,因为我们的软件将在9月/10月发布,我希望在那之前有一个稳定的版本。@Staeff:据说它将在今年年底发布!
// ***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);
         }
    }
}