我针对一个函数建立一个线程threadstart ts=new threadstart(aa)
有时候aa是一个非常复杂的过程,我不喜欢无限制等下去,希望在1分钟后无聊是否结束都断掉线程,该怎么做呢?

解决方案 »

  1.   

    private class ThreadState{
      private ManualResetEvent threadCompleted = new ManualResetEvent(false);
      private Thread thread;
      public bool WaitFor(int milliseconds) {
        if (!threadCompleted.WaitOne(milliseconds, false))
        {
          thread.Abort();
          return false;
        }
        return true;
      }
      public void SetThread(Thread thread) {
        this.thread = thread;
      }
      public void SetCompleted() {
        threadCompleted.Set();
      }
    }// 主过程
    private void StartWorking() {
      ThreadState ts = new ThreadState();
      ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), ts);
      if (ThreadPool.WaitFor(60000))
        ; // OK!
      else
        ; // aborted!
    }// 线程过程
    private void DoWork(object state) {
      ThreadState ts = (ThreadState)state;
      ts.SetThread(Thread.CurrentThread);
      try {       ........  } finally {
        ts.SetCompleted();
      }
    }
      

  2.   

    打错一行if (ThreadPool.WaitFor(60000))应为if (ts.WaitFor(60000))
      

  3.   

    Sample code as follows:
    yourThread.Join( new TimeSpan( 0, 1, 0 ) );
      

  4.   

    private ManualResetEvent threadCompleted = new ManualResetEvent(false);
    经常在异步操作线程的时候都用到这个,这个起什么作用啊,还有那个AutoResetEvent啊,能讲讲吗netmicro(麦)
      

  5.   

    http://www.rainsts.net/article.asp?id=170
      

  6.   

    Manual/AutoResetEvent 是一个信号产生器经常用于线程之间互相联系、确认对方状态一个比较生动的例子就是餐厅的厨房和大堂之间的沟通:一个小铃钟平时,这个钟处于“不响”的状态 (new XXXXResetEvent(false) 的false=不响)厨房做完一道菜了,就敲响这个钟 ( xxxx.Set() )于是等着这个钟响 ( xxxx.WaitOne() ) 的大堂就知道他们要来上菜了在编程的世界,这个钟被敲响了之后,不会随着时间自动变没声音如果是 AutoResetEvent,在有人听到钟响(即WaitOne() 返回true)的时候,自动变成没声音 (auto reset)如果是 ManualResetEvent,则无论有多少线程 WaitOne() 过了,返回true了,都不会变没声音,需要手动调用 Reset() (manual reset) 才会变没声音至于等待的那方,WaitOne() 的结果将会是一直等着这个钟响,直到超时或者线程被中断。无论如何返回,返回值表示是否听到钟响。ManualResetEvent 和 AutoResetEvent 都派生自定义了 WaitOne() 的 WaitHandle 类,顾名(wait-handle:等待-句柄)思义,它是用来等东西的一种资源,所以比较适合用来“等”就例如你的例子此外我也说说,你估计用的是WinForm吧?这样的话,叫UI线程干等1分钟的话,1分钟内所有UI事件都无法处理,所以你大概要弄个UI计时器(System.Windows.Forms.Timer),在时间到的时候调用WaitFor(0) (以我的例子来说)或者 if (!thread.Join(0)) thread.Abort(); (以愚翁的例子来说)。