Product
アプリのローカル キャッシュに保存されているオブジェクト aがあります。この製品キャッシュは、簡単に変更できない ORM コードを使用してデータベースから読み込まれます。簡単にするために、次のProduct
とおりです。
Public Class Product
Public Property ID as Integer
Public Property Name as String
Public Property Price as Decimal
Public Property Rank as Integer
End Class
製品はローカル キャッシュに保存されます。
Public Class ProductList
Public Shared Function GetCache as List(Of Product)
Static _List as List(Of Product)
If _List is Nothing then
'Code to load Data and populate List from DB
End If
Return _List
End Function
End Class
これは非常に単純化されていますが、アイデアは得られます。
このRank
プロパティは、過去 90 日間のすべての売上に基づくバインドされていない計算フィールドであるため、一般的な製品が検索で上位に表示されます。時間がかかる可能性があるため、バックグラウンドスレッドでランクを生成し、時々更新したいと考えています。このようなもの:
Public Sub UpdateRank
Dim dt as Datatable
dt = GetDataTable("exec usp_GetProductRank") 'Returns [ID, Rank]
For each row in dt.rows
_prod = getCache.getbyID(row.item(0))
If _prod isnot Nothing then
_prod.rank = row.item(1)
End If
Next
End Sub
ランクの更新中にキャッシュが使用される可能性があり、その結果ダーティ リードが発生する可能性がありますが、私はそれを喜んで受け入れています。私がやりたいことは、これをスレッドセーフな方法で実行することです。つまり、追加や削除などを気にせずにコレクションを更新します。
を使用しSystem.ComponentModel.BackgroundWorker
てこの更新を実行できますか? このようなことのためにメイン UI で多くのスレッドを使用しますが、これは DLL の非 UI クラスです。キャッシュをDictionary(of Integer, Product)
最初に引っ張ることを考えていましたか?
これを処理する最善の方法は何ですか?