DbContextにおける並列処理の備忘録
はじめに
個人アプリでDbContextを用いて並列処理を扱う機会があったので備忘録として残します。
DbContextはスレッドセーフではない
DbContext はスレッドセーフではありません。 スレッド間でコンテキストを共有しないでください。 コンテキスト インスタンスの使用を継続する前に、すべての非同期呼び出しを必ず待機するようにしてください。
当初、DIコンテナのライフサイクルをSingleton
で実装していたため、並列処理をした際に上記の内容で引っかかりました。
どうやらコンテキストの共有ができないとのことでライフサイクルをScopedに変更することで対処が出来ました。
container.Register(Of IGetTodosRepository, GetTodosRepository)(Lifestyle.Scoped)
おわりに
よくよく考えたらWebアプリ系を作る場合は複数のアクセスが発生するのでそもそもライフサイクルはScopedやTransientにしたほうがいいですね。。。
とはいえおかげでまた一つ勉強になりました!!