Мне нужно сделать существующий поток приложений безопасным. Из-за обстоятельств (см. Ниже) я решил использовать один единственный 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. Это означает, что ВСЕ клиенты фактически читают / пишут одни и те же бизнес-объекты. Это нельзя изменить, оно высечено в камне. Надежда на безопасность потоков заключается в том, что эти удаленные бизнес-объекты доступны только для чтения в глазах удаленных клиентов (хотя они и делают много циклов), а все операции записи красиво разделены на выделенный фасад.
Я ожидаю редких записей и частых чтений. Бизнес-объекты тесно связаны, они очень "графичны".