日期:2014-05-18  浏览次数:20832 次

ThreadPool的一些疑问
数据库中有一张A表。如果有要处理的订单数据就会进入到A表,我需要每隔几秒就查下有要处理的订单吗。如果使用计时器每隔几秒搜索一次,有要处理的订单就for循环读取数据处理我感觉效率太低,所以就想使用ThreadPool来处理,因为之前没用过,我贴代码大家帮忙看下有哪儿些问题?还有就是如果是调用全局变量的话,线程池里的线程之间会出现混乱吗,就是线程1会读到线程2的变量值吗?
C# code

private void Form1_Load(object sender, EventArgs e)
{
       ThreadPool.SetMaxThreads(200, 200);
       ThreadPool.SetMinThreads(100, 100);
       TimerCallback timerDelegate = new TimerCallback(test);
       System.Threading.Timerime = new System.Threading.Timer(timerDelegate, this, 0, 5000);
}
public void test(object obj)
{
       ThreadPool.QueueUserWorkItem(delegate(object obj1)
       {
            deal();
            Thread.Sleep(1000);
       }); 
}
public void deal()
{
       //一次性读取表里top20的数据进行业务处理
}




------解决方案--------------------
如果只是轮询的话,直接用 Timer 就可以了,timer本身就是在子线程里。

你起一个线程轮询还是多线程轮询,在增量少的时候,没什么区别。
------解决方案--------------------

 用ThreadPool的时候,如果是用全局变量的话,注意在每个Thread操作变量的时候加锁,操作完毕之后解锁就行了。
------解决方案--------------------
System.Threading.Timer本身就是在内部使用线程池,所以没有必要在回调中使用 ThreadPool.QueueUserWorkItem

我的看法是在回调中查询表A,如果结果的行数>0,则在循环加将每个任务使用ThreadPool.QueueUserWorkItem去操作。