簡體   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