System.Threading.Timer time = null;
        private Thread threadOne;
        private Thread threadTwo;
        private event EventHandler OnNumberClear;
        public Form2()
        {
            InitializeComponent();
            
        }
        private void Form2_Load(object sender, EventArgs e)
        {
            TimerCallback timerDelegate = new TimerCallback(Action);
            time = new System.Threading.Timer(timerDelegate, this, 0, 10000);
        }
        public void ThreadDemo_OnNumberClear(object sender, EventArgs e)
        {
            threadOne.Join();
            threadTwo.Join();
            GC.SuppressFinalize(this);
        }
        public void Action(object state)
        {
            threadOne = new Thread(new ThreadStart(Run), 1024 * 512);
            threadTwo = new Thread(new ThreadStart(Run), 1024 * 512);
            threadOne.IsBackground = true;
            threadTwo.IsBackground = true;
            threadOne.Name = "1";
            threadTwo.Name = "2";
            OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);
            threadOne.Start();
            threadTwo.Start();
        }
        private void Run()
        {
            Monitor.Enter(this);
            DataSet ds = null;
            //读取数据库中的一条记录,放入DataSet里
            Monitor.Exit(this);
            if (ds.Tables[0].Rows.Count > 0)
            {
                //业务逻辑
            }
            else
            {
                OnNumberClear(this, new EventArgs());
            }
            Thread.Sleep(1000);
        }
在运行过程中出现的最大问题就是内存使用非常大,我一般就是开启6到10个线程,哪儿个地方没释放吗?
还有就是这种写法有什么问题吗,我要实现的效果就是每10秒钟读取下数据库看看是否有要处理的数据(因为数据量比较大)所以采用多线程的方式进行处理的,还有什么更好的写法吗,多线程的新手一个,望大家指点

解决方案 »

  1.   

    线程多了,GC可能就没机会运行,所以你可以主动调用GC,比如在你的Run方法内部的DataSet ds = null;
    之后加上一句GC.Colect()
      

  2.   

    看样子没什么问题呀。 GC.SuppressFinalize(this);会影响吗?
      

  3.   

    threadOne.Join();
    threadTwo.Join();
    这里可以吗,用Abort总是会抛异常,然后程序开一段时间就自动掉了
      

  4.   

    问题1:程序运行时,占用内存比较大,有什么更好的方式让内存使用率降低,比如释放什么
    问题2:预期的效果——线程1读取数据库一条数据,进入业务逻辑处理,处理完毕之后,线程1才继续读下一条数据进行处理。线程1处理的同时,其他线程也按照这样的流程到数据库读数据进行处理,但是线程之间不得重复读取同一条数据。现在的效果——线程1读取数据后进入业务逻辑处理,业务逻辑处理还没有完毕,线程1又会去读取其他数据进行处理。如何才能让线程1完成的处理掉一条数据以后才去读下一条数据?
    问题3:电脑有双核跟四核的,XP系统运行起来可以。服务器是s2003的系统,两颗四核CPU,为啥就运行不起来呢。核心越多,处理速度就越快么?
      

  5.   

    内存占用大,需要及时释放占用的资源。不要一条条读,一次都读出来 然后分条处理。I/O 读写是顺序读要好些。用Plinq 可以充分利用CPU的多核心