一个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.用变量记录线程数量,线程启动时增加,结束时减少,达到上限时就等待,这个变量要做同步处理.
--------------------编程问答-------------------- 楼上说明白了,有线程池,为什么还要自己写一个出来?不如自己看看线程池的实现更好。 --------------------编程问答--------------------
因为线程池最低要运行与CPU核心数量相同的数量,现在都是双核,4核甚至8核的CPU了,如果线程运算量比较大,只想开2个,3个线程,我不知道能不能解决
补充:.NET技术 , C#