我經常發現某些API中的某些方法不是線程安全的。例如,讓我們考慮一下EF上下文。這裏是我可以從asp.net核心教程引用的警告:EF上下文不是線程安全的,爲什麼不通過設計使線程安全?
EF上下文不是線程安全的:不要嘗試並行執行多個操作。當您撥打任何
async
EF方法時,請始終使用await
關鍵字。
問題
一般而言,方法的線程安全性高由設計決定,或者是發現後面的錯誤呢?對於上面的EF上下文,爲什麼不讓它線程安全?
我經常發現某些API中的某些方法不是線程安全的。例如,讓我們考慮一下EF上下文。這裏是我可以從asp.net核心教程引用的警告:EF上下文不是線程安全的,爲什麼不通過設計使線程安全?
EF上下文不是線程安全的:不要嘗試並行執行多個操作。當您撥打任何
async
EF方法時,請始終使用await
關鍵字。
一般而言,方法的線程安全性高由設計決定,或者是發現後面的錯誤呢?對於上面的EF上下文,爲什麼不讓它線程安全?
通常,使可變數據結構線程安全非常困難,並且對單線程用例有負面影響。
通常需要不同的(更復雜的)api來完成這些更改(即Dictionary與ConcurrentDictionary)。
因爲做起來非常複雜?誰知道,無論如何,這隻能用意見來回答。 – DavidG
我認爲這個問題必須寫給EF的作者。我的意見:因爲線程安全有成本。 – Ingaz
當然,它不是線程安全的,您可以創建一個DbContext,以跟蹤對模型所做的更改。如果您在多個線程中進行更改,您如何建議它知道要保存什麼以及何時(例如,在多線程中執行更新時)? DbContext基本上被扔掉了。 – Luke