由于ReaderWriterLockSlim该类使用线程ID来查看谁拥有该锁是否可以安全地使用异步方法,其中没有保证所有方法将在同一线程上执行.
例如.
System.Threading.ReaderWriterLockSlim readerwriterlock = new System.Threading.ReaderWriterLockSlim();
private async Task Test()
{
readerwriterlock.EnterWriteLock();
await Task.Yield(); //do work that could yield the task
readerwriterlock.ExitWriteLock(); //potentailly exit the lock on a different thread
}
Run Code Online (Sandbox Code Playgroud) 我有一种情况,ReadWriterLockSlim抛出异常"System.Threading.SynchronizationLockException - 写锁定被释放而不被保留." 当我尝试执行ExitWriteLock()时.据我所知,这不应该发生,因为进入try块的后续线程将"阻塞"直到他们可以获得锁定.我在这里错过了什么吗?
该问题与此问题非常相似,但没有找到解决方案.
//Code simplified for example.
public class i18nService {
internal static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
private string ProcessText()
{
try {
cacheLock.EnterWriteLock();
return "xyz";
}
finally {
cacheLock.ExitWriteLock(); // Error is throwing here.
}
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助 :-)
在他的回答中,/sf/answers/1376510621/
斯蒂芬·克利里提到
ReaderWriterLockSlim 是一种线程仿射锁类型,因此通常 不能与 async 和 await 一起使用。
他所说的“通常”是什么意思?什么时候可以ReaderWriterLockSlim使用?
另外,我在这里读http://joeduffyblog.com/2007/02/07/introducing-the-new-readerwriterlockslim-in-orcas/是ReaderWriterLockSlim有不同的怪癖,但这篇文章是从2007年开始它是否从那时起改变?