簡體   English   中英

取消長時間運行的實體框架6異步請求

[英]Cancel Long Running Entity Framework 6 async requests

我在WPF應用程序中使用Entity Framework 6( DbContext ),我想找到一種方法來正確取消async數據加載方法( ToListAsyncFirstOrDefaultAsync ),這樣我就可以立即啟動另一個請求。

我一直在努力堅持每個表單的單個上下文(在我的情況下是tab)標准,到目前為止,我一直在通過確保在請求期間禁用UI來處理這些調用的非線程安全性質,因此,當用戶正在進行時,用戶無法啟動任何新請求。 但是,我現在遇到一個用例,這是不可能的。 我需要在一些長時間運行的請求期間保持UI響應,為了做到這一點,我需要一種方法來取消當前請求並立即啟動另一個請求。

我已經嘗試利用添加到Async方法的CancellationToken支持,但我發現當我取消請求時,它實際上並沒有取消任何內容。 它將正確拋出OperationCanceledException ,但請求仍在進行中,當我嘗試在此之后再發出請求時,我仍然得到NotSupportedException (A second operation started on this context...)

我正在使用更改跟蹤,因此更改應用程序以為每個請求使用新的上下文是不現實的。

此外,我暫時解決了這個問題,處理當前上下文並在每次特定視圖模型發出請求時創建一個新上下文,而其中一個已在進行中。 這在技術上解決了我的問題,但我想知道是否有辦法在保持相同的背景下這樣做。

那么,有沒有人有這方面的經驗? 我發現很難相信我是第一個遇到這個問題的人,但是我在這里找到的類似問題的所有其他答案要么建議我使用CancellationToken (這不能正常工作),要么是有點舊並且不適用於Async方法。

編輯1:

既然沒有人回答這個問題,我真的開始想知道我的選擇是什么。 一點背景。 我正在將Silverlight應用程序轉換為WPF。Silverlight應用程序在EF 4.1中使用WCF RIA服務,但是對於WPF應用程序,我們決定只使用EF6.1。

使用Silverlight和WCF,您可以隨時進行異步調用的數量沒有限制,我們實際上只有整個應用程序的單個上下文(糟糕,我知道,但很簡單,我們從來沒有遇到任何問題)。 我們只是直接綁定到實體,並使用更改跟蹤來保存用戶所做的更改。

在真實世界的應用程序中,使用EF 6.1和Async方法在WPF中無法做到這一點,有時,您只需要取消應用程序在執行過程中所執行的操作並執行用戶想要的操作,崩潰和燃燒?

暫時發布我的解決方案。 我不是一個狂熱的粉絲,但是我已經能夠開始工作,不需要從頭開始重寫這個應用程序。

現在我使用的AsyncLock從類AsyncEx中正在訪問或保存跟蹤實體庫的方法。 每個DbContext對象都使用自己的鎖,因此我不會阻止來自其他上下文或未跟蹤實體的其他調用。

作為示例,我的存儲庫中的GetListAsync方法:

public async virtual Task<IList<T>> GetListAsync(IDbContext context,
                                                 Expression<Func<T, bool>> where,
                                                 IOrderByClause<T>[] orderBy = null,
                                                 params Expression<Func<T, object>>[] navigationProperties)
{
    using (await context.ContextLock.LockAsync())
    {
        IList<T> list = await GetListQuery(context, where, orderBy, navigationProperties).ToListAsync();
        return list;
    }
}

GetListQuery使用nav屬性以及where和order by子句創建查詢。

我也可能使用CancellationToken添加超時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM