public void()
{
Thread[] threads = new Thread[4]; for (int i = 0; i < threadCount; i++)
{
Thread t = new Thread(new ThreadStart(Add));
threads[i] = t;
}
for (int i = 0; i < threadCount; i++)
{
threads[i].Start();
} SomeMethod();
}
public void Add()
{
//
}Add是个需要执行时间比较长的函数我想等生成的这四个线程全执行完Add再去执行SomeMethod可这写的话threads[i].Start();之后,就利马执行SomeMethod了怎么解决?让生成的所有线程全执行完,再执行接下来的语句

解决方案 »

  1.   

    Thread.Join 方法
    阻塞调用线程,直到某个线程终止时为止
      

  2.   

    for (int i = 0; i < threadCount; i++)
    {
    threads[i].Start();
    }
    for (int i = 0; i < threadCount; i++)
    {
    threads[i].Join();
    }??
      

  3.   

    public void()

     lock(this)
    {
    Thread[] threads = new Thread[4]; for (int i = 0; i < threadCount; i++)
    {
    Thread t = new Thread(new ThreadStart(Add));
    threads[i] = t;
    }
    for (int i = 0; i < threadCount; i++)
    {
    threads[i].Start();
    }
    } SomeMethod();
    }
    public void Add()
    {
    //
    }
      

  4.   

    把你的通过Name属性找到要暂停的程先
    Thread.CurrentThread.Suspend();//挂起
    Thread.CurrentThread.Resume.//唤醒
      

  5.   

    就手问一下LOCK的问题 
    ASP.NET中
    两个人访问就是两个HTTP请求,就会生成两个当前ASPX页面的类的对象对吧
    这个类里有个地方是被lock住了
    一个对象进入这个段代码,另外一个HTTP请求还能进入么?我的理解是LOCK是对同一个对象中的多线程起作用的
    两个对象,LOCK就不管用了,对么?也就是说另外一个HTTP请求是可以进入的,对么?
      

  6.   

    for (int i = 0; i < threadCount; i++)
    {
    threads[i].Start();
    }
    for (int i = 0; i < threadCount; i++)
    {
    threads[i].Join();
    }??
    我用这种方法测试成功了LOCK的没试有人说赞成LOCK  那能告诉我为什么JOIN的方式不好么?
      

  7.   

    测试了,LOCK的不成功发现了JOIN也有一个问题,JOIN也是四个线程分别JOIN也就是说,只能判断某个线程是否执行完毕,如果这个线程执行完毕了,他马上就会再建立一个新的线程了我是想等四个线程全执行完毕,然后执行下面的语句,怎么办?
      

  8.   

    这是你线程之间规划的问题,比较好地解决办法应该是如下:
    1、创建每个子线程的时候,要提供回调函数,并给他们分配一个唯一ID号;
    2、每个子线程完成后,用自己的唯一ID号来调用回调函数;
    3、在回调函数中,判断当前的ID号是否收齐,如果收齐,触发相应的事件。
      

  9.   

    while(true)
    {
       //不断监测所有子线程状态
      if(finished.count==total.count)
       break;
    }
    用一个类实现thread。start(),在最后通知住程序完成自身任务
    {
       parent.addtofinishedqueue(value);
    }
      

  10.   

    Knight94(愚翁)能说具体点么 谢了关于我回贴中提到的LOCK问题 能回答下么
      

  11.   

    使用线程池:
     class Program
        {
            static void Main(string[] args)
            {
                ManualResetEvent[] manualEvents = new ManualResetEvent[4];
                for (int i = 0; i < 4; i++)
                {
                    manualEvents[i] = new ManualResetEvent(false);
                    System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(Add), manualEvents[i]);
                }
                WaitHandle.WaitAll(manualEvents);
                Console.Write("All Thread Over");
                Console.ReadLine(); 
            }
            public static void Add(object stateinfo)
            {
                try
                {
                    Console.WriteLine("I am over");
                }
                catch
                {
                }
                finally
                {
                    ManualResetEvent manualEvent = (ManualResetEvent)stateinfo;
                    manualEvent.Set();            }
            }
        }
    结果:
    I am over
    I am over
    I am over
    I am over
    All Thread Over
      

  12.   

    Lock好像是线程之间的互斥吧,与你要完成的,没什么不是一回事
      

  13.   

    Lock好像是线程之间的互斥吧,与你要完成的不是一回事
      

  14.   

    我知道 LOCK是另外一个问题
    线程同步的问题用zhongkeruanjian(编程亮子) ( ) 信誉:75 的线程池方法解决了LOCK谁能解释一下
    =======
    就手问一下LOCK的问题 
    ASP.NET中
    两个人访问就是两个HTTP请求,就会生成两个当前ASPX页面的类的对象对吧
    这个类里有个地方是被lock住了
    一个对象进入这个段代码,另外一个HTTP请求还能进入么?我的理解是LOCK是对同一个对象中的多线程起作用的
    两个对象,LOCK就不管用了,对么?也就是说另外一个HTTP请求是可以进入的,对么?
    完事了就揭帖 谢谢大家
      

  15.   

    那肯定是同时执行了。LOCK是对象锁,只有多个线程在访问同一个对象实例的时候用LOCK才有效。两个HTTP会生成两个ASPX对象。LOCK没有作用的。你的理解是对的
      

  16.   

    建议使用mutex效果更好一些。