gpt4 book ai didi

.net - .NET 中的声明性线程安全

转载 作者:行者123 更新时间:2023-12-04 22:26:29 26 4
gpt4 key购买 nike

我需要使现有的应用程序线程安全。由于情况(见下文),我决定对整个业务对象图使用一个 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。这意味着所有客户端实际上读取/写入完全相同的业务对象。这是无法改变的,它是刻在石头上的。线程安全的希望是这些远程业务对象在远程客户端眼中是只读的(认为它们确实循环了许多列表)并且所有写操作都很好地分离到一个专用的外观中。
我希望很少写入和频繁读取。业务对象是高度关联的,它们非常“图形”。

最佳答案

我会使用 PostSharp 做类似的事情。

它作为一个额外的构建步骤运行并插入相应的 MSIL,但它会做你想做的。
PostSharp 属性定义看起来像这样(取决于您的确切实现)。然后可以像上面描述的那样使用这些。

public sealed class ReadOperationAttribute : OnMethodBoundaryAspect
{
// not quite sure how you manage your lock, so put this dummy method in.
ReaderWriterLock _rwLock = ReaderWriterLock.GetCorrectReaderWriterLock();

[ThreadStatic]
static bool _isLocked;

public override void OnEntry( MethodExecutionEventArgs e )
{
try
{
_rwLock.AcquireReaderLock(10000);
_isLocked = true;
}
catch
{
_isLocked = false;
throw;
}
}

public override void OnExit( MethodExecutionEventArgs e )
{
if (_isLocked)
{
_rwLock.ReleaseReaderLock();
_isLocked = false;
}
}
}

public sealed class WriteOperationAttribute : OnMethodBoundaryAspect
{
// not quite sure how you manage your lock, so put this dummy method in.
ReaderWriterLock _rwLock = ReaderWriterLock.GetCorrectReaderWriterLock();

[ThreadStatic]
static bool _isLocked;

public override void OnEntry( MethodExecutionEventArgs e )
{
try
{
_rwLock.AcquireWriterLock(10000);
_isLocked = true;
}
catch
{
_isLocked = false;
throw;
}
}

public override void OnExit( MethodExecutionEventArgs e )
{
if (_isLocked)
{
_rwLock.ReleaseReaderLock();
_isLocked = false;
}
}
}

编辑:更新以解决问题。 (未经测试;))
另外,请注意,正如我在对问题的评论中所说,Microsoft recommends 使用 ReaderWriterLockSlim 而不是 ReaderWriterLock

关于.net - .NET 中的声明性线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com