【发布时间】:2015-05-14 22:25:29
【问题描述】:
我正在尝试使用 ReaderWriterLockSlim 以这样的异步方法锁定一些数据库工作:
readerWriterLock.EnterWriteLock();
using (var db = new MyContextDB())
{
// look something up and alter it
}
readerWriterLock.ExitWriteLock();
这会引发异常,因为多个线程同时尝试进入 writelock。现在我可以使用锁定对象,但我想我会使用 ReaderWriterLockSlim,这样我就可以尝试通过读/写和可升级进行一些优化。
ReaderWriterLockSlim 的 MSDN 示例让我有些困惑。有没有一种简单的方法让线程等待锁变得可用? IsWriteLockHeld 属性表示它只是测试当前线程是否被锁定。 WaitingWriteCount 表示它给出了等待进入的线程数,但是如何让线程等待进入?我在任何样品中都找不到。我的意思是循环直到它不抛出异常?这似乎不对。
【问题讨论】:
-
首先为什么要为局部变量加锁?
-
这会引发异常,因为多个线程同时尝试进入 writelock。 这应该不会导致异常。您能否提供完整的示例来展示所描述的行为?
-
我在类构造函数中声明了锁。我应该在每个线程中声明吗?那么如何为多个数据库分组锁呢?
-
"这会引发异常,因为多个线程同时尝试进入 writelock。"不,它没有。导致异常的原因是另一回事。你得到了什么例外?
-
递归锁异常
标签: c# multithreading asynchronous async-await