当前位置:编程学习 > C#/ASP.NET >>

一个newfish想出的C#控制线程数量的办法,分享一下,另外求改进

搜了很多资料,都晦涩难懂,只好自己想办法了。。。。自己想办法的话,就只能在自己现有的知识水平上搜寻了,前几天用Queue<>解决了一个问题,隐隐约约感觉能解决现在这个控制线程数量的问题,研究了2个小时,终于试出了办法,可以说达到了控制线程数量的使用需求。。。

没错,目前我的水平暂时就是这样了,遇到问题就实时求助,然后拼接进自己的代码。。。。希望有天自己也能成为高手。。。


namespace test多线程
{
    public partial class Form1 : Form
    {
        public Queue<string> todoList = new Queue<string>();
        public const int maxRunningThread = 3;
        public int ThreadCount = 0;

        public Form1()
        {
            InitializeComponent();
        }

        public void showForm2(object o)
        {
            
            //处理
            new Form2(o.ToString()).ShowDialog();
            //测试时使用
            //MessageBox.Show(o.ToString());
            ThreadCount--;

            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                todoList.Enqueue(listBox1.Items[i].ToString());
            }
            while (true)
            {
                while ((todoList.Count > 0) && (ThreadCount < maxRunningThread))
                {
                    ThreadCount++;
                    Thread Th1 = new Thread(showForm2);
                    Th1.Name = todoList.Dequeue();
                    Th1.Start(Th1.Name.ToString());
                }
                if (todoList.Count == 0)
                    break;
            }

        }
    }
}


这个办法虽然达到了使用要求,但是有个两个较大的缺点

1.在处理完listbox之前,while(true)需要不停的运行,这样也会占用一定的资源,甚至是10%的CPU
2.showForm2(object o)必须使用类似与ShowDialog()的方法,新的窗口可以正常显示(此时可以在这个页面执行处理代码)。如果使用show()的话,会导致窗口一闪而过,因此我也无法判断是不是同时执行了maxRunningThread个线程

求改进! --------------------编程问答-------------------- 还有一个办法是

ThreadPool.SetMaxThreads(4, 4);
for (int i = 0; i < listBox1.Items.Count; i++)
{              
     System.Threading.WaitCallback waitCallback = new WaitCallback(showForm2);
     ThreadPool.QueueUserWorkItem(waitCallback, listBox1.Items[i]);
}

public void showForm2(object o)
{
    MessageBox.Show(o.ToString());
}

但是这个办法的缺点是不能控制小于CPU核心数量的线程,比如,如果你的电脑是4核,那么最低也要运行4个线程,如果你的线程对CPU占用较高,开4个线程反而是不能达到提高处理速度的要求的。

在设置最大处理线程之前,可以先测试一下自己的线程对CPU,内存,硬盘有多高的占用,比如,如果占用在20~30%之间,开3个就比较合适。

--------------------编程问答-------------------- 控制线程数量   
1.用线程池,设置线程池的大小.
2.用变量记录线程数量,线程启动时增加,结束时减少,达到上限时就等待,这个变量要做同步处理.
--------------------编程问答-------------------- 楼上说明白了,有线程池,为什么还要自己写一个出来?不如自己看看线程池的实现更好。 --------------------编程问答--------------------
引用 3 楼 wangxingge2010 的回复:
楼上说明白了,有线程池,为什么还要自己写一个出来?不如自己看看线程池的实现更好。

因为线程池最低要运行与CPU核心数量相同的数量,现在都是双核,4核甚至8核的CPU了,如果线程运算量比较大,只想开2个,3个线程,我不知道能不能解决
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,