internal static void EnterReadLock(string conn_str, int time) { if (_dic.ContainsKey(conn_str)) { bool isSuccess = _dic[conn_str].ReadWirteLock.TryEnterReadLock(time); if (!isSuccess) { throw new LockTimeoutException("获取读锁超时"); } return; } else { lock (obj) { if (_dic.ContainsKey(conn_str)) { _dic[conn_str].ReadWirteLock.TryEnterReadLock(time); return; } _dic[conn_str] = new LockHelper.DbLock(conn_str); bool isSuccess = _dic[conn_str].ReadWirteLock.TryEnterReadLock(time); if (!isSuccess) { throw new LockTimeoutException("获取读锁超时"); } } } }
internal static void EnterWriteLock(string conn_str, int time) { if (_dic.ContainsKey(conn_str)) { //先加写锁,用于控制当前进程,其他线程不可以使用 bool isSuccess = _dic[conn_str].ReadWirteLock.TryEnterWriteLock(time); if (!isSuccess) { throw new LockTimeoutException("获取写锁超时"); } //获取到写锁后,在重新获取经常互斥体,用于控制多进程只有一个线程可以访问 isSuccess = _dic[conn_str].Mutex.WaitOne(time); if (!isSuccess) { throw new ProccessLockTimeoutException("获取进程级写锁超时"); } return; } else { lock (obj) { if (_dic.ContainsKey(conn_str)) { _dic[conn_str].ReadWirteLock.TryEnterReadLock(time); return; } _dic[conn_str] = new LockHelper.DbLock(conn_str); //先加写锁,用于控制当前进程,其他线程不可以使用 bool isSuccess = _dic[conn_str].ReadWirteLock.TryEnterWriteLock(time); if (!isSuccess) { throw new LockTimeoutException("获取写锁超时"); } //获取到写锁后,在重新获取经常互斥体,用于控制多进程只有一个线程可以访问 isSuccess = _dic[conn_str].Mutex.WaitOne(time); if (!isSuccess) { throw new ProccessLockTimeoutException("获取进程级写锁超时"); } } } }