解决方案 »

  1.   

    如果你的 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());
      

  2.   

    使用线程对象的Aborted属性判断线程是否结束
      

  3.   

    如果你不想一下子开count个,那么你就别写 i<listBox1.Items.Count 呗。
      

  4.   

    是的,是一个图片处理的程序,中间有for,while等循环,但一定会执行完的
      

  5.   

    一开始第一个想到的办法就是这个,完了才想到要控制线程的数量,毕竟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());
    这个代码我试了试,没看出来怎么用的。能再给个解决方案吗?麻烦你了!
      

  6.   


    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());
    }
      

  7.   

    ThreadPool我之前还真没用过,现学现卖,上面的代码我测过了,没问题,应该可以符合你的需求ThreadPool.SetMaxThreads(4, 4);但是这两个参数我还没完全理解
      

  8.   


    感谢,经过测试,完全达到要求没错,目前我的水平暂时就是这样了,遇到问题就实时求助,然后拼接进自己的代码。希望有天自己也能成为高手
    我现在有时间就到csdn看看,看到别人的问题,会的我就说说,不会而且有价值我就收藏了,坐等大神的答案,能学到不少东西。慢慢学吧~共勉啊~
      

  9.   


    感谢,经过测试,完全达到要求没错,目前我的水平暂时就是这样了,遇到问题就实时求助,然后拼接进自己的代码。希望有天自己也能成为高手
    我现在有时间就到csdn看看,看到别人的问题,会的我就说说,不会而且有价值我就收藏了,坐等大神的答案,能学到不少东西。慢慢学吧~共勉啊~关于我的问题我想到了一个间接的办法,那就是预估线程需要执行的时间,等到了一定的时间再开新线程,比如,我测试一个线程处理数据需要10分钟,我就等12分钟再开新线程,不过这样虽然可以,就是太不科学了,CPU利用率也不高,顶多是替代了手工操作而已了。坐等高手的答案吧
      

  10.   

    那没必要了,ThreadPool就是把所有的线程加入等待队列,比如目前最大4个进程,有一个结束的时候,马上就会启动下一个;
      

  11.   


    感谢,经过测试,完全达到要求没错,目前我的水平暂时就是这样了,遇到问题就实时求助,然后拼接进自己的代码。希望有天自己也能成为高手又试了下,还是不够理想啊,貌似只有设置为4以上的数时才有效,低于4就不受控制了怎么回事呢
    你是四核电脑吧
    不能将辅助线程的数目或 I/O 完成线程的数目设置为小于计算机的处理器数目
    是I5 2430笔记本CPU,双核4线程,是这个原因吗?
      

  12.   

    http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool.setmaxthreads(v=vs.110).aspx
    应该是,msdn备注里说明了这一点
      

  13.   

    使用多线程+线程安全队列,将所有的任务抽象为一个过程+为过程提供的对象,即委托+参数
    记事本写的代码,排版乱了见谅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!
      

  14.   

    如果你想开count个线程,那你至少有个变量记录哪count个线程正在运行,这样就知道谁跑完了,后面的可以补上。