现在有5个主线任务,每个任务都要等上一个任务完成才能进行。
每个任务里面也许还有数量不等的子任务,子任务都可以同时进行。 类似于:int[] maintask = new int[5]{100,50,25,25,2};for (int i = 0; i < maintask.length; i++)
{
System.Threading.ThreadPool.QueueUserWorkItem(p =>
{
    for (int j = 0; j < maintask[i]; j++)
    {
        System.Threading.ThreadPool.QueueUserWorkItem(c =>
        {
// do....            
        });         Console.WriteLine("子任务都结束了。退出!");
    }
}); Console.WriteLine("子任务都结束了。继续下个主线任务!");
}↑
以上代码意会即可....:)想请教下最好的管理方法。谢谢。

解决方案 »

  1.   

    一个任务就是一个方法程序,或者要包装成对象则可以说是Delegate。如果一谈到任务就说“线程”,至少我是做不出来的,我认为这实在太疯狂、太离谱了。线程是调度任务的一种方式。既然你调度一个任务之后才调度另外一个,直接调用第一个方法程序然后在调用第二个方法程序....这样就行了,我相信每一个学编程的人都会写这样两条语句的。如果不能把复杂机制用到该用的地方,搞设计还是简单一点吧。
      

  2.   

    var a = new Thread(A);
    a.Start();
    var b = new Thread(B);
    b.Start();
    a.Join();
     b.Join();
      

  3.   

    我给个方案吧
      int[] maintask = new int[5] { 100, 50, 25, 25, 2 };            AutoResetEvent mainEvent = new AutoResetEvent(false);
                for (int i = 0; i < maintask.Length; i++)
                {
                    System.Threading.ThreadPool.QueueUserWorkItem(p =>
                    {
                        //假设当前主任务有10个子任务,新建10个Event对象
                        int subTaskCount = 10;
                        AutoResetEvent[] events = new AutoResetEvent[subTaskCount];
                        for (var ei = 0; ei < events.Length; ei++)
                        {
                            events[i] = new AutoResetEvent(false);
                        }
                        for (int j = 0; j < subTaskCount; j++)
                        {
                            //将Event[j]作为参数传入Thread
                            //Thread完成后执行Set
                            System.Threading.ThreadPool.QueueUserWorkItem(ev =>
                            {
                                AutoResetEvent evt = ev as AutoResetEvent;
                                // do....   
                                evt.Set();                        },events[j]);
                            Console.WriteLine("子任务都结束了。退出!");
                        }
                        //等待所有子线程完成
                        if (WaitHandle.WaitAll(events))
                        {
                            //通知主线程可继续执行下一任务
                            mainEvent.Set();
                        }
                    });                //等待当前主线程完成
                    mainEvent.WaitOne();                Console.WriteLine("子任务都结束了。继续下个主线任务!");
                }
      

  4.   

    其实你的MainTask不应该在每个for循环里开线程去执行,
    而是整个for循环做一个线程去处理比较恰当.对于子线程的同步控制,仍然可以参照上面的代码.