EF6 とその Async 関数のテストを開始したところです。それらがスレッドセーフではないことに気付いたとき、少年は驚きました。それがポイントだと思いました。
私はTask
何年も前から独自の拡張メソッドを持っていましたが、私が EF から待っていたのは、それらをスレッド セーフにすることでした。
少なくとも私のタスクベースの機能lock
は、互いに干渉しないように編集されました。EF6はそこまで行きません。しかし、主な問題は、私のコードが彼らのコードと共有しているものです。つまり、非同期クエリを発行してから、完了する前に、遅延読み込みをトリガーするナビゲーション プロパティ (同じコンテキストで事前に読み込まれた完全に別のエンティティ) へのアクセスを試みます。これは、UI、即時関数以外の他のコード、またはその他の多数のシナリオによってトリガーされる可能性があります。
私の知る限り。dbContext で (エンティティ間で) 共有される可変リソースは、接続と変更追跡 (キャッシュ) の 2 つだけです。それらの周りにロックを機能に追加できれば、スレッドセーフなコンテキストが得られます。
2段階で行うこともできます。データベースのクエリに使用される 1 つの集中型関数をロックするプロバイダーを実装できれば。非エンティティ (匿名) オブジェクトを返すか、AsNoTracking() を呼び出すことによって、追跡されていないクエリはスレッド セーフになり、別のスレッドが遅延ロードされたオブジェクトを要求している場合でも、Async 関数で安全に呼び出すことができます。
スレッドごとに 1 つのコンテキストを使用する必要があるため、スケーラビリティはそれほど悪くはありません。少しの並列処理を導入するために await を 1 つでもスキップしようとすると、非同期関数でさえテーブルから外れます。待機中の関数がタスクで返されるとトリガーされる可能性のあるシステム (wpf など)。
だから私の質問はです。このようなプロバイダーを実装した人はいますか。それとも、私と一緒に仕事をしてくれる人はいますか?