c# 关于线程的读写锁
1 //读写线程锁 2 static ReaderWriterLockSlim m_RWLock = new ReaderWriterLockSlim(); 3 4 while(true){ 5 DataTable dt = 从SQLServer获取一批数据; 6 if (dt.Rows.Count <= 0)// 没有数据就退出 7 break; 8 9 处理数据代码1(如果SQLServer慢,处理数据代码放入线程) 10 11 //阻塞,直到获取到写锁(写锁只允许一个线程读取数据) 12 //只有下面的ReadLock全部释放,这一步才能继续, 13 //这样可以读取数据库和写入Redis同步进行,节省读取数据库的时间 14 m_RWLock.EnterWriteLock(); 15 //获取到写锁后,马上释放 16 m_RWLock.ExitWriteLock(); 17 18 // 使用线程写入到Redis 19 ThreadPool.UnsafeQueueUserWorkItem(state => { 20 try 21 { 22 //获取读锁, 允许多个线程同时操作Redis 23 m_RWLock.EnterReadLock(); 24 try 25 { 26 处理数据代码2(如果Redis慢,处理数据代码放EnterWriteLock前面) 27 28 WriteToRedis(item1.Key, item1.Value); 29 } 30 finally 31 { 32 m_RWLock.ExitReadLock(); 33 } 34 } 35 catch (Exception ex) 36 { 37 LogHelper.WriteException("异常:", ex); 38 } 39 }, null); 40 }