比如现在有20个子线程和一个主线程。怎么判断20个子线程已经运行完毕,在主线程中打印任务执行完毕!

解决方案 »

  1.   

    是否可以用join()?主线程等待子线程运行完再执行
      

  2.   

    那你就在进程看还在运行没的 System.Diagnostics.Process[] allProcess = System.Diagnostics.Process.GetProcesses();
                foreach (System.Diagnostics.Process thisprocess in allProcess)
                {
                    string processName = thisprocess.ProcessName;
                    if (processName.ToLower() == "进程名字")
                    {
                        try
                        {
                            //执行没结束的操作
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show(e.Message);
                            return;
                        }
                    }
                }
      

  3.   

    如果是.Net4可以用CountDownEvent等,写法最简单。
    以前版本可以用回调,用事件(见例子),等等。int threads;
    private void button1_Click(object sender, EventArgs e)
    {
        int threadCount = threads = 4;
        AutoResetEvent eventFinished = new AutoResetEvent(false);
        for (int i = 0; i < threadCount; i++)
        {
            ThreadPool.QueueUserWorkItem(state =>
                {
                    Thread.Sleep(Math.Abs(Guid.NewGuid().GetHashCode()) % 1000);
                    if (Interlocked.Decrement(ref this.threads) == 0)
                    {
                        (state as AutoResetEvent).Set();
                    }
                },
                eventFinished
                );
        }    eventFinished.WaitOne();
        //执行完毕 
    }
      

  4.   

    .net 4.0 还可以用Task
    var array = Enumerable.Range(1, 10);
    var factory = new TaskFactory();
    var tasks = new List<Task>();
    foreach (var i in array)
    {
        Action<object> action = obj => 
        { 
            Thread.Sleep(1000); 
            Console.WriteLine(obj); 
        };
        tasks.Add(factory.StartNew(action, i));
    }
    //异步等待全部完毕
    //factory.ContinueWhenAll(tasks.ToArray(), ts => { MessageBox.Show("all over"); });//同步等待全部通知
    Task.WaitAll(tasks.ToArray());
    MessageBox.Show("all over");
      

  5.   

    目前是.net3.5版本,求高手解决。用计数器貌似也行不通。高手能详细点不?谢谢