InstanceContextMode=SingleおよびConcurrencyMode=Multipleでタグ付けされた単純なWCFサービスがあります。リストを返すメソッドの場合、データベースにアクセスして呼び出しが行われたときにリストに入力するのではなく、リストのローカルコピーを返すだけです。リストは、24時間ごとにデータベースに送信され、リストを再作成するバックグラウンドスレッドによって維持されます。並行性の問題は、コレクションを返すメソッド内とコレクションを埋めるメソッド内の2か所でオブジェクトをロックすることで処理します。
私の質問は、どうすればこれをより効率的にすることができるかということです。現在、クライアントが呼び出すアウトサービスメソッド「GetCustomers」にボトルネックがあります。
public List<ZGpCustomer> GetCustomers()
{
List<ZGpCustomer> customerListCopy = new List<ZGpCustomer>();
lock (_customerLock)
{
customerListCopy = new List<ZGpCustomer>(_customers);
}
return customerListCopy;
}
「_customers」は24時間ごとにのみ入力されるため、コレクションを変更する場合にのみ、GetCustomersメソッド内でロックする必要があるだけのようです。現在の設定方法では、1000個のリクエストが同時に着信した場合、一度に1つのスレッドのみがそのメソッドにアクセスできるため、1000個のリクエストを効果的にキューに入れています。これにより、サービスのマルチスレッドの側面がやや役に立たなくなりますね。
この種のパターンのベストプラクティスはありますか?オブジェクトを保存するために、より適切なデータ収集を使用する必要がありますか?「BlockingCollection」の方が適していますか?