如果你的 showForm2 方法原本就是一个顺序执行的方法,那么可以写var tsks = new List<Task>(); for (int i = 0; i < listBox1.Items.Count; i++) { tsks.Add(new Task(()=>showForm2(listBox1.Items[i]))); } Task.WaitAll(tsks.ToArray());
使用线程对象的Aborted属性判断线程是否结束
如果你不想一下子开count个,那么你就别写 i<listBox1.Items.Count 呗。
是的,是一个图片处理的程序,中间有for,while等循环,但一定会执行完的
一开始第一个想到的办法就是这个,完了才想到要控制线程的数量,毕竟CPU处理能力有限。 var tsks = new List<Task>(); for (int i = 0; i < listBox1.Items.Count; i++) { tsks.Add(new Task(()=>showForm2(listBox1.Items[i]))); } Task.WaitAll(tsks.ToArray()); 这个代码我试了试,没看出来怎么用的。能再给个解决方案吗?麻烦你了!
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()); }
for (int i = 0; i < listBox1.Items.Count; i++)
{
tsks.Add(new Task(()=>showForm2(listBox1.Items[i])));
}
Task.WaitAll(tsks.ToArray());
var tsks = new List<Task>();
for (int i = 0; i < listBox1.Items.Count; i++)
{
tsks.Add(new Task(()=>showForm2(listBox1.Items[i])));
}
Task.WaitAll(tsks.ToArray());
这个代码我试了试,没看出来怎么用的。能再给个解决方案吗?麻烦你了!
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());
}
感谢,经过测试,完全达到要求没错,目前我的水平暂时就是这样了,遇到问题就实时求助,然后拼接进自己的代码。希望有天自己也能成为高手
我现在有时间就到csdn看看,看到别人的问题,会的我就说说,不会而且有价值我就收藏了,坐等大神的答案,能学到不少东西。慢慢学吧~共勉啊~
感谢,经过测试,完全达到要求没错,目前我的水平暂时就是这样了,遇到问题就实时求助,然后拼接进自己的代码。希望有天自己也能成为高手
我现在有时间就到csdn看看,看到别人的问题,会的我就说说,不会而且有价值我就收藏了,坐等大神的答案,能学到不少东西。慢慢学吧~共勉啊~关于我的问题我想到了一个间接的办法,那就是预估线程需要执行的时间,等到了一定的时间再开新线程,比如,我测试一个线程处理数据需要10分钟,我就等12分钟再开新线程,不过这样虽然可以,就是太不科学了,CPU利用率也不高,顶多是替代了手工操作而已了。坐等高手的答案吧
感谢,经过测试,完全达到要求没错,目前我的水平暂时就是这样了,遇到问题就实时求助,然后拼接进自己的代码。希望有天自己也能成为高手又试了下,还是不够理想啊,貌似只有设置为4以上的数时才有效,低于4就不受控制了怎么回事呢
你是四核电脑吧
不能将辅助线程的数目或 I/O 完成线程的数目设置为小于计算机的处理器数目
是I5 2430笔记本CPU,双核4线程,是这个原因吗?
应该是,msdn备注里说明了这一点
记事本写的代码,排版乱了见谅using System;
using System.Threading;
using System.Collections;
class a{
static void Main(){
qthread qth=new qthread(new ParameterizedThreadStart(run));//新建qthread实例,传入方法
for(int i=0;i<10;i++)//将要进行操作的数据放入队列
{
qth.works.Enqueue(i.ToString());
}
qth.DoWork(4);//4线程
}
static void run(object obj)//工作方法
{
string s;
Queue works=obj as Queue;
while(works.Count>0)
{
s=works.Dequeue() as string;
int i=random.Next(1000,4001);
Console.WriteLine("thread:{0},id:{1},obj:{2},sleep:{3}",Thread.CurrentThread.Name,Thread.CurrentThread.ManagedThreadId,s,i.ToString());
Thread.Sleep(i);//随机sleep1-4秒,代替耗时
Console.WriteLine("thread:{0},id:{1},obj:{2}..........ok!",Thread.CurrentThread.Name,Thread.CurrentThread.ManagedThreadId,s);
}
}
volatile static Random random=new Random();
}
class qthread{
ParameterizedThreadStart pts=null;
public volatile Queue works=Queue.Synchronized(new Queue());//线程安全队列,存放参数
public qthread(ParameterizedThreadStart pts)
{
this.pts=pts;
}
public void DoWork(int count)
{
for(int i=0;i<count;i++)
{
Thread t = new Thread(pts);
t.Name=("qthread#"+i.ToString());
t.IsBackground = false;
t.Start(works);
}
}
}编译执行:csc qthread.cs && qthread
结果:
thread:qthread#0,id:3,obj:0,sleep:1207
thread:qthread#2,id:5,obj:3,sleep:2454
thread:qthread#1,id:4,obj:1,sleep:1239
thread:qthread#3,id:6,obj:2,sleep:1183
thread:qthread#3,id:6,obj:2..........ok!
thread:qthread#3,id:6,obj:4,sleep:2779
thread:qthread#0,id:3,obj:0..........ok!
thread:qthread#0,id:3,obj:5,sleep:2182
thread:qthread#1,id:4,obj:1..........ok!
thread:qthread#1,id:4,obj:6,sleep:3887
thread:qthread#2,id:5,obj:3..........ok!
thread:qthread#2,id:5,obj:7,sleep:2473
thread:qthread#0,id:3,obj:5..........ok!
thread:qthread#0,id:3,obj:8,sleep:1297
thread:qthread#3,id:6,obj:4..........ok!
thread:qthread#3,id:6,obj:9,sleep:3133
thread:qthread#0,id:3,obj:8..........ok!
thread:qthread#2,id:5,obj:7..........ok!
thread:qthread#1,id:4,obj:6..........ok!
thread:qthread#3,id:6,obj:9..........ok!