我有一个Timer
,它每15分钟更新一次DataTable
,我有十个线程在这个DataTable
上搜索。如果我在阅读的时候锁定数据表,程序的速度会很慢,有没有办法只在写的时候锁定DataTable
?
我的代码:
//variable
private static readonly Object lockObj = new Object();
private static DataTable DT = new DataTable();
//start
Timer update_timer = new System.Timers.Timer(60000*15);
update_timer.Elapsed += new ElapsedEventHandler(updateDataTable);
updatetimer.Start();
Thread readThread = new Thread(new ThreadStart(() => searchDataTable(0) ));
readThread.Start();
...
Thread readThread10 = new Thread(new ThreadStart(() => searchDataTable(9) ));
readThread10.Start();
//function
private void updateDataTable(object source, ElapsedEventArgs e)
{
lock (lockObj)
{
// read data from database and update DT
}
}
private void searchDataTable(int index)
{
string tempItem="";
while(ConcurrentQueueDictionary[index].TryDequeue(out tempItem))
{
lock (lockObj)
{
// search tempItem on DT
}
}
}
我没有写完整的代码,以免太长。但重要的部分已经写好了。
1条答案
按热度按时间y1aodyip1#
一个解决方案是使用
ReaderWriterLockSlim
。这样,in writing mode the DataTable is locked
。但是several threads can read from the DataTable at the same time on reading mode
:ReaderWriterLockSlim:
不管递归策略如何,任何时候都只能有一个线程处于写模式。当一个线程处于写模式时,其他线程不能以任何模式进入锁。任何时候都只能有一个线程处于可升级模式。任何数量的线程都可以处于读取模式,并且可以有一个线程处于可升级模式,而其他线程处于读取模式。