[英]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.