+ -
当前位置:首页 → 问答吧 → 在多线程学习中遇到的问题,球高手指点

在多线程学习中遇到的问题,球高手指点

时间:2011-12-14

来源:互联网

C# code
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秒钟读取下数据库看看是否有要处理的数据(因为数据量比较大)所以采用多线程的方式进行处理的,还有什么更好的写法吗,多线程的新手一个,望大家指点

作者: wahf19841010   发布时间: 2011-12-14

帮帮忙啊

作者: wahf19841010   发布时间: 2011-12-14

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

作者: stonespace   发布时间: 2011-12-14

看样子没什么问题呀。

 GC.SuppressFinalize(this);

会影响吗?

作者: mjp1234airen4385   发布时间: 2011-12-14

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

作者: wahf19841010   发布时间: 2011-12-14

你要做什么

作者: Sandy945   发布时间: 2011-12-14

就是读取数据库的数据进行操作,原来是单线程运行的,现在数据多了,为了加快效率就想用多线程操作,因为数据不是不断更新的,所以就加了个计时器

作者: wahf19841010   发布时间: 2011-12-14