既存のアプリをスレッドセーフにする必要があります。事情により (以下を参照)、ビジネス オブジェクトのグラフ全体に対して 1 つの ReaderWriterLock を使用することにしました。すべてのメソッド/プロパティは次のようになっている必要があります。
public int MyReadOperation(string inputParam)
{
rwLock.AcquireReaderLock(10000);
try
{
// do all read operations
...
}
finally
{
rwLock.ReleaseReaderLock();
}
}
public void MyWriteOperation(string input)
{
rwLock.AcquireWriterLock(10000);
try
{
// do all write operations
...
}
finally
{
rwLock.ReleaseWriterLock();
}
}
しかし、カバーする方法が膨大にあり、コピー/貼り付けのアイデアに夢中になっています。MethodImplAttribute に触発されて、上記のコードのように動作しながら、次のようなコードを使用したいと思います。
[ReadOperation]
public int MyReadOperation(string inputParam)
{
// do all read operations
...
}
[WriteOperation]
public void MyWriteOperation(string input)
{
// do all write operations
...
}
プロパティまたはメソッドに入る前/後にスレッドの実行を中断し、スレッドセーフの予防策を追加する方法はありますか? または、C# の関数型言語機能を何らかの方法で利用して、メソッドの生産的な本体を汎用の ReaderWriterLock 取得 "フレーム" に埋め込みますか?
背景のビット:
私は、データ キャリア ビジネス オブジェクトが .NET Remoting 経由で公開されるプロジェクトに取り組んでいます。ただし、これらのデータ クラスはシリアライズ可能ではなく、MarshalByRef-s です。これは、すべてのクライアントが実際にはまったく同じビジネス オブジェクトを読み書きすることを意味します。これは変更できません。石に刻まれています。スレッド セーフの望みは、これらのリモート ビジネス オブジェクトがリモート クライアントからは読み取り専用であり (多くのリストをループすると考えられている)、すべての書き込み操作が専用のファサードに適切に分離されることです。まれな書き込みと頻繁な読み取りを期待しています。ビジネス オブジェクトは高度に接続されており、非常に「グラフィック」です。