InstanceContextMode = SingleおよびConcurrencyMode = Multipleでタグ付けされた単純なWCFサービスがあります。リストを返すメソッドでは、データベースにアクセスして呼び出しが行われたときにリストを埋めるのではなく、単にリストのローカルコピーを返します。リストはバックグラウンドスレッドによって維持され、バックグラウンドスレッドは24時間ごとにデータベースにアクセスし、リストを再投入します。オブジェクトを2つの場所にロックすることで、並行処理の問題を処理します。コレクションを返すメソッドの内部と、コレクションを満たすメソッドの内部です。マルチスレッドWCFサービスにおける効率的なコレクションのメンテナンス
私の質問は、これをより効率的にする方法です。現在、私たちは、クライアントが呼び出すことをサービスメソッド「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"はより適切なフィットになりますか?
library/system.collections.concurrent.aspx – mattanja