static void Main(string[] args)
        { 
            Thread th = new Thread(new ThreadStart(fun));
            th.Start(); //首次启动子线程            Thread.Sleep(3000); //主线程停三秒,等待子线程结束            th.Start(); //再次启动子线程(这个时候子线程已经停了)    --这个地方就会出现异常:线程正在运行或被终止;它无法重新启动。
        }        static void fun()
        {
            Thread.Sleep(1000); //子线程停一秒
        }我想再次用这个线程的句柄th启动线程,怎么实现?

解决方案 »

  1.   

    你这里最好用异步
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;namespace ConsoleApplication30
    {
        class Program
        {
            delegate void f();        static f F = new f(fun);        static void Main(string[] args)
            {
                IAsyncResult AR = F.BeginInvoke(null, null);
                AR.AsyncWaitHandle.WaitOne(3000); //等3秒,不填等于死等
                if (AR.IsCompleted) // 超时?
                {
                    AR = F.BeginInvoke(null, null);
                    AR.AsyncWaitHandle.WaitOne(3000); //等3秒,不填等于死等
                    if (AR.IsCompleted) // 超时?
                        Console.WriteLine("ok");
                }
                Console.Read();
            }        static void fun()
            {
                Thread.Sleep(1000); //子线程停一秒
                Console.Write(".");
            }
        }
    }
      

  2.   

    线程一旦终止,它就无法通过再次调用“开始”来重新启动。 你的代码是不可行的,不过你可以使用Suspend()方法挂起线程,然后使用Resume()方法恢复线程,使用这个方法要注意的是 如果你有对多线程间资源互写的操作容易造成死锁! 如果你只是要实现暂停和启动线程,建议你用一个bool 变量来标识 通过外部改变这个 标识的值来控制 线程是否继续执行
      

  3.   

    将这句Thread.Sleep(3000);换成下面的就可以了
    while ((th.ThreadState & (ThreadState.Unstarted | ThreadState.Stopped)) == 0)
    {
         ;//子如果线程没有结束,则继续
    }