NET封装的 线程池类ThreadPool1,怎么挂起里面的 ‘正在执行的线程’ 或 设置 休眠时间?
2,如何停止 ThreadPool里面的线程(里面线程还在执行,手动停止)?给了例子哦

解决方案 »

  1.   

    1,thread.sleep(1000);//休眠1秒2,ThreadPool没用过,只用过自己写的线程控制器.但我想原理基本上也是ThreadPool取出线程对象,然后设置休眠.
      

  2.   

    http://technet.microsoft.com/zh-cn/sysinternals/system.threading.threadpool(VS.95).aspx呵呵,刚查了system.threading.threadpool 发现... 简直还不如你自己写个线程控制器.比如你有20个线程. 你自己写个线程控制.可以是个hashtable可以是 object[] 建议后者.
    然后,根据index或者 key进行 单独的线程操作.
      

  3.   

    在达到如下目标时应使用线程池:1 要以简单的方式创建和删除线程2 应用程序使用线程时性能要优先考虑
    在达到如下目标时应使用Thread类1 要控制使用线程的优先级2希望所使用的线程维护其标示,该标示要与线程一起进行各种操作,经过不同时间段3所使用的线程的寿命比较长
      

  4.   

    只用过smart ThreadPool,他这里面有个组的概念
      

  5.   

    调用线程对象的Suspend()方法就可以挂起一个线程
    Thread.Sleep静态方法,使当前线程挂起指定的时间
      

  6.   

    http://hi.baidu.com/justear/blog/item/9055d45ae489ddd49c8204cc.html
      

  7.   


    Suspend() 微软都不用了NET都显示过时,但没删除!
    这东西很容易引起死锁
      

  8.   

    模拟:一个线程更新数据,两个线程读取数据。更新的时候需要阻止读取的两个现成工作。而另外还有一个信号量来控制线程的退出。using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    namespace WindowsApplication35
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
        System.Threading.ManualResetEvent mEvent = new System.Threading.ManualResetEvent(true);
        //判断线程安全退出的信号量
        System.Threading.ManualResetEvent mEventStopAll = new System.Threading.ManualResetEvent(false);
        //*******ManualResetEvent的用法。
        private void button1_Click(object sender, EventArgs e)
        {
          //一个线程模拟写入
          new System.Threading.Thread(invokeWrite).Start();
          //两个线程模拟读取
          new System.Threading.Thread(invokeRead).Start();
          new System.Threading.Thread(invokeRead).Start();
        }
        private void invokeWrite()
        {
          for (int i = 0; i < 100; i++)
          {
            //判断线程安全退出
            if (mEventStopAll.WaitOne(10, false) == true) break;
            //设置信号量,假设更新数据需要2秒,每更新一次暂停2秒.
            mEvent.Reset();
            Console.WriteLine("正在更新...");
            System.Threading.Thread.Sleep(2000);
            mEvent.Set();
            System.Threading.Thread.Sleep(2000);
          }
        }
        private void invokeRead()
        {
          while (mEvent.WaitOne() == true)
          {
            //判断线程安全退出
            if (mEventStopAll.WaitOne(10, false) == true) break;
            //假设读取一体数据用10毫秒.他需要判断信号量开关.
            Console.WriteLine("读取一条数据:");
            System.Threading.Thread.Sleep(10);
          }
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
          mEventStopAll.Set();
        }
      }
    }
      

  9.   

    定义一个线程数
    int ThreadCount=0;
      /// <summary>
            /// 异步处理
            /// </summary>
           private void AsyncWork(处理对象)
            {
                ThreadCount += 1;//线程+1
            }
    private void AsyncWork_Complete(object sender)
            {
                ThreadCount -= 1;
            }
    结束的时候判断线程数是否为0
    Thread.Abord(Thread.CurrentThread);结束当前正在运行的进程
     在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。 
     Suspend ()挂起.或者如果线程已挂起,则不起作用。 引发异常ThreadStateException未启动线程或线程已死。 
    SecurityException调用方没有适当的 SecurityPermission。
    Thread.Sleep(1000); 将当前线程阻塞指定的毫秒数。
      

  10.   

    Suspend和Resume啊...M$不建议用Suspend的原因是因为Suspend
    你无法精确控制线程停止的时机,如果线程占用了共享资源则在
    它Resume释放锁之前访问该资源的其它线程都会被阻塞。要精确
    控制,自己按时机需求用内核对象写吧...一个测试弄这么复杂干嘛?至于线程池里的,再什么池它也是线程啊。线程开始时用
    Thread.CurrentThread弄到手不就行了么...
      

  11.   

    lock 和 Wait 之类就可以了
      

  12.   


        class Program
        {
            static Object[] ThreadManager = new object[3];
            static void Main(string[] args)
            {            Thread t1 = new Thread(new ThreadStart(Function1));
                t1.Start();
                ThreadManager[0] = t1;            Thread t2 = new Thread(new ThreadStart(Function2));
                t2.Start();
                ThreadManager[1] = t2;            Thread t3 = new Thread(new ThreadStart(Function3));
                t3.Start();
                ThreadManager[2] = t3;            string strTemp = String.Empty;
                Thread tt2 = (Thread)ThreadManager[2];
                while (true)
                {
                    System.Console.WriteLine("main thread...输入命令......");
                    strTemp = System.Console.ReadLine();
                    if (strTemp == "1")
                    {
                        try 
                        {
                            tt2.Suspend();
                        }
                        catch(Exception ex)
                        {
                            string str = ex.ToString();
                        }
                        
                        System.Console.WriteLine("Function [3] Suspend......");
                    }
                    else if (strTemp == "2")
                    {
                        tt2.Resume();
                        System.Console.WriteLine("Function [3] Resume......");
                    }
                    else
                    {
                        Thread.Sleep(500);
                        continue;
                    }
                }        }        static void Function1()
            {
                while (true)
                {
                    System.Console.WriteLine("Function [1] run......");
                    Thread.Sleep(3000);
                }
            }        static void Function2()
            {
                while (true)
                {
                    System.Console.WriteLine("Function [2] run......");
                    Thread.Sleep(3000);
                }
            }        static void Function3()
            {
                while (true)
                {
                    System.Console.WriteLine("Function [3] run......");
                    Thread.Sleep(3000);
                }
            }
        }测试通过.  需求满足.
      

  13.   


    没用!没共用资源! 你应该让他们都调用 FUN1
      

  14.   

    object[] obj = new object[1];
    public void linkstate()
    {
    //DS数据集
    for (int i = 0; i < Ds.Tables[0].Rows.Count; i++)
                {
                     //_TB 一张新的表
                    DataRow dr0 = _TB.NewRow();
                            dr0["sysNO"] = Ds.Tables[0].Rows[i]["SYS_NO"].ToString();
                            dr0["groupNO"] = Ds.Tables[0].Rows[i]["GROUP_NO"].ToString();
                            dr0["TAG_NO"] = Ds.Tables[0].Rows[i]["TAG_NO"].ToString();
                            _TB.Rows.Add(dr0);
                           ParameterizedThreadStart ParStart0 = new ParameterizedThreadStart(JanitorMethodDT);
                                Thread myThread0 = new Thread(ParStart0);
                                myThread0.Start(_TB);
                                obj[i] = myThread0;
                 }
    }
    private Object lockObj = new Object();
        private void JanitorMethodDT(object ob)
        {        DataTable de_All = (DataTable)ob;
            de_All.AcceptChanges();
            if (de_All.Rows.Count > 0)
            {
                
                lock (lockObj)
                {
                    Thread.Sleep(Convert.ToInt32(de_All.Rows[0]["time"]));
                    
                    try
                    {
                       //对 de_All数据的使用
                                        }
                    catch (Exception err)
                    {
                        //throw err;
                    }            }
            }
        }我这么写的,但是冒失有问题!de_All的数据很乱!求解啊!
      

  15.   

    asp  如何保存线程的啊!!!我点击运行后,线程可能比较久,我想随时在点击一按钮,挂起或睡眠线程!!!如何 得到当前的线程 ????我放入 ViewState,可 取的时候一定是NULL!
      

  16.   


    你对线程的应用曲解已经很远了。 共用资源并非让你共用线程方法 所以肯定不需要共用fun1
    建议你最好还是找本高级编程的书看看吧 里面应该有讲线程问题
      

  17.   

    我给的示例代码只是应你帖子的需求来给的 。你的帖子开头并未提出资源共享的需求 ,在多个线程操作下。如果你需要所有线程都操作某个 dataset 或者其他什么,那么你根据我给的代码 再做修改也可以得到你 需要的东西。你只需要再 声明一个全局dataset即可。然后 各个线程方法都对 这个dataset进行操作。 比如 现在我3个线程方法都只执行了 System.Console.WriteLine这个动作,那么你 就 可以把这些动作换成对dataset的操作。。
    悟性很重要啊 。
      

  18.   

    多线程 如果全部靠自己理解还是很难的.
    除非你有看过优秀的多线程代码写的项目.我没说要锁住对象防止非安全操作难道你就不锁了.显然要锁.如果你仅仅是这样的需求:
    多个线程 对 ds进行修改.(增删改)
    1个线程 对ds进行读取. 那么我只能告诉你 这个需求的多线程编码相当简单,你不如把本贴放弃,再开一贴详细描述一下你具体需求 然后发出来,保证你会得到答案(很多人愿意为技术分而写代码帮助别人).但你这个贴最好直接放弃(无满意结贴),里面出言不逊太多,别人看了都不想回答.
      

  19.   


    也许偶对线程理解不够,还不至于不知道自已需求是什么!你的每一个现场调用一个FUN,是至于你明确知道要开启几线程,各自需要多什么!!这种简单应用完全不需要共用资源了,每个线程给单独资源就好,省去麻烦!现在,你创建线程数据根据数据库记录数创建;(你都不知道要创建多少线程,你打算写什么FUN来给它们每一个线程使用?)你的回答我实在不敢认同你对线程的能力!