假如我有一个字符串数组 string[] arr=str.Split(' ');
arr的长度会根据str的变化而变化。
我有一个方法deal(string a){访问数据库,在数据库中对a进行处理,这是一个很大的查询量,会比较耗时}
我想根据字符串数组arr的长度n=arr.Length,来动态的开辟n个线程来调用方法deal(arr[i])对arr中的每个值进行数据库处理。
然后,我需要等待所有的线程执行完毕后,进行一次最终的收尾处理Final(),必须要等待之前的所有线程都执行完毕才执行Final()。开辟线程我倒是懂得怎么弄,但是要等所有的线程都执行完毕这个我不是很懂,请各位高手帮忙指点迷津!谢谢!!!

解决方案 »

  1.   

    给你个思路:用异步回调,线程执行完后返回一个结果值。判断所有线程是否执行完,即判断所有线程是否都返回执行结果,是则调用Final()
      

  2.   

    首先你这种做法,在字符串数组小的时候还可以,但数组多的时候,不如有1000甚至更多字符的时候,你的程序就会变得效率很低,要记住一点不是线程开的越多,效率就越高,这是多线程编程里很多人不注意的问题。如果你硬要这么做,你可以使用信号量来控制。主线程开辟子线程,然后WaitAll来等待所有线程Set后继续处理。
      

  3.   

    你可以用一个计数器,当一个线程结束时就将它加1,而且要给这个计数器加上一个锁,以防止同时多个线程操作它而导致不准确,当计数器等于n时则表明所有的线程都已经结束可以执行Final()
      

  4.   


    这样肯定不行,主线程怎么等待子线程呢?while去轮询这个计数器??呵呵,主线程就把cpu占尽了你就用AutoResetEvent来控制线程就可以了,这样就可以阻塞住主线程,而不是去轮询了。算了我写个示例代码吧。class Program
    {
    Thread[] _thds;
    AutoResetEvent[] _resetEvents;
    object[] _result;
    static Main()
    {
    string[] arr = new string[20];_thds = new Thread[arr.Length];
    _resetEvents = new AutoResetEvent[arr.Length];
    _result = new object[arr.Length];
    for(int i = 0; i< arr.Length; i ++)
    {
    _thds[i] = new Thread(Process);
    _thds[i].Name = i.ToString();
    _resetEvents[i] = new AutoResetEvent(false);
    _thds[i].Start(arr[i]);
    }
    AutoResetEvent.WaitAll(_resetEvents);//开始处理最后的结果,从_result里拿出来。
    }static void Process(object data)
    {
     char a = (char)data;
    int index = (int)Thread.CurrentThread.Name;
    //处理事务代码_result[i] = 处理后的结果;
    _resetEvents[i].Set();
    }
    }代码刚刚手写的,可能有点问题,但你应该稍微改下就可以了。
      

  5.   


    在主线程中使用AutoResetEvent.WaitAll(_resetEvents); 会让界面卡住。
    最好使用两个线程。
    把Main中的代码放到一个线程中,然后由这个线程再执行其他线程并等待,也可以简单的使用join
    ---------------
    先一下。