背景: リクエスタにオブジェクトを提供することを目的とするサービスがあります。基本的には、データベースから複雑なデータを取得し、それを 1 回変換して (データのビューに少し似ています)、単純化されたレコードを生成します。次に、要求に応じて最大 10 万件のレコード (要求の性質による) を提供することで、他のサービスからの要求を処理します。
アイデアは、複雑な変換が一度行われ、サービスによってキャッシュされるということです-ビューがアクセスされるたびにデータベースにそれを処理させるよりも速く機能し、私の目的ではうまく機能します. (一部の人はこれを SSOS と呼んでいると思います)
データがキャッシュされる方法は、標準の .Net 型のプロパティ バッグであるオブジェクトのリストにあります。これらのオブジェクトには、他のオブジェクトへの参照はありません。レコードは定期的に変更され、キャッシュを更新する必要があります。つまり、元のレコードを見つけて破棄し、置き換える必要があります。
これで、キャッシュ内のレコードは長い間存在し、Gen 2 コレクションとしてマークされます。これらのオブジェクトは長い間 (意図的に) ぶらぶらしているため、ほぼすべてのコレクションが Gen2 フェーズで発生します。
したがって、Gen2 コレクションは遅いというのが私の理解です。コレクションが主に Gen2 で動作している場合、オプティマイザーはこれをより頻繁に実行します。
完全なGen2コレクションをトリガーしない方法で、リスト内のオブジェクトを逆参照できるようにしたいと思います... Gen0としてマークしてから逆参照する方法があるのではないかと考えていました置き換える前に参照しますが、それは不可能だと思います。
私はこれに.Net 4を使用することに制約されており、アプリケーションは、完全なリストまたは一定期間にわたるリストへの変更を要求する最大100のクライアントにデータを提供するサービスです。
質問: GC に適した方法で長寿命のオブジェクトを逆参照する方法、またはこの問題に対処する別の方法を提案できる人はいますか?