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 }