iT邦幫忙

0

C# DbContext 連線於不同Thread運作問題

  • 分享至 

  • xImage

https://ithelp.ithome.com.tw/upload/images/20220921/20145396mcHKCANBoa.png

需求是非常常見的清單分頁方式,需要取得總數與指定頁碼的資料,會下兩個Query對DB做查詢。
但是因為資料量龐大DB側的Table已經調整過效能與建立Index仍不足需求,因此希望試試將兩個Query分成兩個Thread同時處理來節省時間,卻發生了錯誤:
System.InvalidOperationException: A second operation started on this context before a previous operation completed. This is usually caused by different threads using the same instance of DbContext.
想請問各位先進我明明有使用DbContextOptionsBuilder來建立新的執行個體,為何還會出現同時使用到同一個DbContext執行個體的情況呢?

----------------------------------------------- 9/23 自行結案
感謝各位大大的幫助,
最後小弟發現了只是我在寫Func的時候誤把使用的DB寫成DI注入的DB...

看更多先前的討論...收起先前的討論...
APPX Jim iT邦新手 5 級 ‧ 2022-09-21 20:10:30 檢舉
怎知 二次 GetContext 函式的回值物件 是不同的連線物件?!
有用 == 或是 equals 比對嗎?!
bodera iT邦新手 4 級 ‧ 2022-09-22 08:44:13 檢舉
我使用了Object.Equals(DB1, DB2)去比對 回傳是false
jyo238 iT邦新手 5 級 ‧ 2022-09-22 15:43:22 檢舉
改使用using (var context = service.GetDBContext())包在task.run內看看,然後你陣列使用方法怪怪的,append是回傳新增元素後的新陣列而不是在目標陣列新增元素..其實可以直接 Task.WaitAll(new Task[] {TaskItemList,TaskRowNums}) 就好
bodera iT邦新手 4 級 ‧ 2022-09-22 16:09:38 檢舉
試過了還是不行~我的理解是using只是實作區域結束時去dispose而已,所以沒有差別,append感謝點出!
jyo238 iT邦新手 5 級 ‧ 2022-09-22 16:54:42 檢舉
Task.Run(()=>{
using (var context = DBDataService.GetDbContext(connectionString))
{
IEnumerable<T> itemList = itemFunc(context );
return itemList;
}
})
這樣不行嗎?如果不行的話先試試看下列方法直接實體化context看看
using (var context = new yourContext())
{
//your code
}
然後你的理解算是半對而已,因為using 是實作try finally,然後再finally調用dispose(),然後若是單純只需要調用dispose的話,那為何需要using呢?對吧
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答