请问各位大大:
    有三个线程T1 ,T2, T3 ,T1与T2 可以并行执行,T3需待T1 ,T2都执行完毕才能执行;
1,T1 ,T2同时执行;
2,T1 ,T2执行完毕,T1 ,T2挂起,  T3开始执行;
3,T3执行完毕, 唤醒T1 ,T2 重复步骤 1,2
 
如何用C# 线程实现以上操作 ?请各位给出见解,谢谢!

解决方案 »

  1.   

    将T1,T2装进一个线程里面,执行完毕再调用T3,T3执行完毕就调用那个线程.
      

  2.   

    jiujiang88:
    将T1,T2装进一个线程里面,执行完毕再调用T3 ,T3执行完毕就调用那个线程. 如何实现?
    线程如何调用另一个线程?
      

  3.   

    用线程池 ThreadPool  他是个静态类 里面有可以自动列队的方法
      

  4.   

    比较笨的阻塞方法,主线程基本上是这样:var lock1 = new ManualResetEvent(false);
    var lock2 = new ManualResetEvent(false);
    执行T1并且T1中对lock1执行Set;
    执行T2并且T1中对lock2执行Set;
    lock1.WaitOne();
    lock2.WaitOne();
      

  5.   

    var lock1 = new ManualResetEvent(false); 
    var lock2 = new ManualResetEvent(false); 
    执行T1并且T1中对lock1执行Set; 
    执行T2并且T1中对lock2执行Set; 
    lock1.WaitOne(); 
    lock2.WaitOne(); 
    执行T3;  
      

  6.   

    呵呵,还是写错一个字!!
    比较笨的阻塞方法,主线程基本上是这样: var lock1 = new ManualResetEvent(false); 
    var lock2 = new ManualResetEvent(false); 
    执行T1并且T1中对lock1执行Set; 
    执行T2并且T2中对lock2执行Set; 
    lock1.WaitOne(); 
    lock2.WaitOne(); 
    执行T3;
      

  7.   

    根据SP1234 大哥提供的方案,得出以下测试例子:class Program
        {
            int interval = 1000;               bool hasT1 = false;
            bool hasT2 = false;
             
            static AutoResetEvent AutoEvn1 = new AutoResetEvent(true);        static AutoResetEvent AutoEvn2 = new AutoResetEvent(true);        
            
            static void Main(string[] args)
            {
                Program p = new Program();
                Thread T1= new Thread(new ThreadStart(p.goGetT1));
                T1.Start();             Thread T2= new Thread(new ThreadStart(p.goGetT2));
                 T2.Start();   
      
                Thread T3= new Thread(new ThreadStart(p.updateTaobao));
                T3.Start();
                       }        public void goGetT1() //  
            {           
                while (true)
                {
                    AutoEvn1.WaitOne();
                    doT1();                
                }
            }
            public void doT1()
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("T1 do     running  -------  " + i);
                    Thread.Sleep(interval);
                }
                AutoEvn1.Reset();
                this.hasT1 = true;
            }
            public void goGetT2() //  
            {
                while (true)
                {
                    AutoEvn2.WaitOne();
                    doT2();
                }
            }        public void doT2()
            {
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine("T2 in running  -------  " + i);
                    Thread.Sleep(interval);
                }
                
                AutoEvn2.Reset();
                this.hasT2  = true;
            }            public void goT3() //更新淘宝库存
            {            while (true)
                {
                    if (this.hasT1 && this.hasT2)
                    {
                        //
                        int i = 1;
                        while (i < 20)
                        {
                            Console.WriteLine("T3 in running  -------  " + i);
                            i++;
                            Thread.Sleep(500);
                        }
                        Console.WriteLine("T3 finished");
                        Thread.Sleep(500);
                        this.hasT1 = false;
                        this.hasT2 = false;                    AutoEvn1.Set();
                        AutoEvn2.Set();
                    }
                }
            }
        } 请问还有优化的地方或另一更优化的方法不?