在程序中,我开启了10个线程,我想在规定时间后去检查 还剩余几个线程未执行.怎么做?
上代码,哈哈,谢谢了

解决方案 »

  1.   

    四、使用IAsyncResult asyncResult属性来判断异步调用是否完成虽然上面的方法可以很好地实现异步调用,但是当调用EndInvoke方法获得调用结果时,整个程序就象死了一样,这样做用户的感觉并不会太好,因此,我们可以使用asyncResult来判断异步调用是否完成,并显示一些提示信息。这样做可以增加用户体验。代码如下:static void Main(string[] args) 
     {      NewTaskDelegate task = newTask; 
         IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); 
            while (!asyncResult.IsCompleted)   
       {       
       Console.Write("*");  
         Thread.Sleep(100);      
       }      // 由于异步调用已经完成,因此, EndInvoke会立刻返回结果 
         int result = task.EndInvoke(asyncResult); 
        Console.WriteLine(result);  }   
      

  2.   

    定义一个变量,int TASKCOUNT = 10;
    //线程结束
    Interlocked.Decrement(ref TASKCOUNT) ;
      

  3.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Data.SqlClient;
    using System.Data;namespace ConApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                for (int index = TASKCOUNT; --index >= 0; )
                {
                    ThreadPool.QueueUserWorkItem(Run,index);                Thread.Sleep(new Random(Guid.NewGuid().GetHashCode()).Next(100, 500));
                }
                wait.WaitOne();            Console.WriteLine("任意键结束....");
                Console.ReadKey();
              
            }        static ManualResetEvent wait = new ManualResetEvent(false);        static int TASKCOUNT = 100;        static void Run(object obj)
            {            Thread.CurrentThread.Name = obj.ToString();            Thread.Sleep(new Random(Guid.NewGuid().GetHashCode()).Next(4000, 5000));
                if (Interlocked.Decrement(ref TASKCOUNT) == 0)
                {
                    wait.Set();
                }
                else
                {
                    Console.WriteLine("完成{0}", obj);
                }
            }
        }   
    }
      

  4.   

    Console.WriteLine("完成{0}", TASKCOUNT);
      

  5.   

    TASKCOUNT 才是没完成的个数
      

  6.   


    我换成TASKCOUNT了,执行了一下.还是不对啊.
      

  7.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Data.SqlClient;
    using System.Data;namespace ConApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                for (int index = TASKCOUNT; --index >= 0; )
                {
                    ThreadPool.QueueUserWorkItem(Run, index);                Thread.Sleep(new Random(Guid.NewGuid().GetHashCode()).Next(100, 500));
                }
                wait.WaitOne();            Console.WriteLine("任意键结束....");
                Console.ReadKey();        }        static ManualResetEvent wait = new ManualResetEvent(false);        static int TASKCOUNT = 100;        static void Run(object obj)
            {            Thread.CurrentThread.Name = obj.ToString();            Thread.Sleep(new Random(Guid.NewGuid().GetHashCode()).Next(4000, 5000));
                if (Interlocked.Decrement(ref TASKCOUNT) == 0)
                {
                    wait.Set();
                }
                else
                {
                    Console.WriteLine("还有{0}个未完成", TASKCOUNT);
                }
            }
        }
    }
      

  8.   

    建议使用Task<T>代替,有比较方便的线程结果,完成情况等等
      

  9.   

    Thread.IsAlive
    返回true,表示线程还在执行,false已经完成
      

  10.   

    是Task还是Thread?
    通过Thread.IsAlive可以知道线程是否在执行,不过是完成还是被中止就不一定了,相比之下Thread.ThreadState可以提供更多的信息。Task则可以用IsCompleted获得是否完成
      

  11.   

    1。用线程的Join方法
    2.不用线程,用BackgroundWorker并注册WorkComplete事件
      

  12.   


    是Thread,上段代码 看看
      

  13.   

    WaitForSingleObject(hThread,INFINITE);