我正在尝试实现许多使用ReaderWriterLockSlim进行线程安全的属性。 所以最喜欢我结束了我的所有属性是这样的:在很多属性中使用ReaderWriterLockSlim的更简单的方法
public string Name
{
get
{
rwLock.EnterReadLock();
try {
return name;
}
finally {
rwLock.ExitReadLock();
}
}
set
{
rwLock.EnterWriteLock();
try {
name = value;
}
finally {
rwLock.ExitWriteLock();
}
}
}
这种感觉非常详细,并在10种性质重复的,所以我要寻找一个更干的实现。
显而易见的解决方案是将其封装到释放对dispose的锁定的类中,并允许将我的线程安全操作放入using语句中。显然,根据this和其他一些来源,这不是很安全。
所以我试图拿出一个好看的解决方案使用lambda表达式和匿名方法:
private TResult ThreadSafeRead<TResult>(Func<TResult> value)
{
rwLock.EnterReadLock();
try {
return value();
}
finally {
rwLock.ExitReadLock();
}
}
private void ThreadSafeWrite(Action value)
{
rwLock.EnterWriteLock();
try {
value();
}
finally {
rwLock.ExitWriteLock();
}
}
public string Name
{
get { return ThreadSafeRead(() => name); }
set { ThreadSafeWrite(() => { name = value; }); }
}
虽然这消除了重复代码,这是讨厌我,我不知道,如果它是作为线程像我最初的详细实施一样安全。
有没有人对MSIL有更深入的理解,这将会产生多线程 理论能够告诉我我的实现是否安全?
这与线程安全无关。问题来自你的线程调用Thread.Abort。 – usr