0

私の ASP.NET アプリケーションは、さまざまなデータ チャンクへのアクセスを提供します。各チャンクには 1 人以上のユーザーが同時にアクセスできるため、アプリは競合を防止する必要があります。

多くの検討の結果、オプティミスティック コンカレンシーはこのシナリオに最適なソリューションではないと考えており、現在、適切なオプションとしてロックを検討しています。

SyncLock次のように a を使用して、すべてのリクエストを 1 つずつ簡単に処理できます。

新しいオブジェクトとしてのプライベート共有 AccessLock

 SyncLock AccessLock

 ..Do some reading and writing here

 End Synclock

しかし、それはアプリケーションのスケーラビリティを大きく制限します。

そのため、データの特定の部分のみへのアクセスを何らかの方法でエンキューすることを考えています。たとえば、あるキューはデータの一部にアクセスするためのもので、別のキューはデータの別の部分にアクセスするためのものです。

すべてに対して 1 つのキューだけでなく、データの異なる部分に対して異なるキューを使用するように同期ロックをカスタマイズする方法はありますか? つまり、「SyncLock (「Group1」) や「SyncLock (「Group2」)」などを手動で指定できるようになるということです。

4

2 に答える 2

0

すべてに対して 1 つのキューだけでなく、データの異なる部分に対して異なるキューを使用するように同期ロックをカスタマイズする方法はありますか? つまり、「SyncLock (「Group1」) や「SyncLock (「Group2」)」などを手動で指定できるようになるということです。

はい。SyncLock「Group1」オブジェクトまたは「Group2」オブジェクトの2 つの個別のオブジェクトを持つことができます。

しかし、私はあなたのデザインを再考します。データを保持するために1 つ以上のConcurrentQueue(Of T)コレクションを用意することを検討してください。これにより、スレッドセーフを維持しながら、複数のスレッドがロックを取得せずにデータにアクセスできるようになる可能性があります。

于 2012-01-27T21:44:53.000 に答える
0

オブジェクトをグループに分割し、それぞれを個別のロックで保護できます。これは、ロック ストライピングと呼ばれます。

一度に複数のロックにアクセスする必要がある場合は、それらを常に同じ順序で取得する必要があります。そうしないと、デッドロックが発生します。

于 2012-01-27T21:48:19.100 に答える