一个线程结束后,我需要执行一个我自定义的方法ccc。听说用委托回调的方法能完成,谁知道怎么写。例如:private void aaa()
{
   //以前是这么写的
   Thread th=new Thread(new ThreadStart(bbb));
   th.Start();
}//线程中执行的方法
private void bbb()
{
  //执行的代码
}//线程结束后执行的方法
private void ccc()
{
  //执行的代码
}是不是应该这么写 Thread th=new Thread(里面是个委托),然后怎么判断这个委托结束了呢。
循环判读线程是否存活的那个方法我会写,请大家就别写了。

解决方案 »

  1.   

    private void bbb() 

      //执行的代码    ccc();            //<---
      

  2.   

    if (t.ThreadState == ThreadState.Stopped)
      

  3.   

    public event EventHandle AfterThread;
    private void aaa() 

      //以前是这么写的 
      Thread th=new Thread(new ThreadStart(bbb)); 
      th.Start(); 
    } //线程中执行的方法 
    private void bbb() 

      //执行的代码 
      if(AfterThread!=null)
       AfterThread(this,null);
    } //线程到这里就算是结束。
     //引发事件后,再调用CCC()
    //线程结束后执行的方法 
    private void ccc() 

      //执行的代码 
      

  4.   

    4# 已给出答案
    建议LZ做下封装:
    public delegate void ThreadExeHandler();
    public delegate void AfterThreadExeHandler();
    MyThread
    {
       public event ThreadExeHandler ThreadExeEvent;
       public event AfterThreadExeHandler AfterThreadExeEvent;
       
       public void Start()
       {
           Thread th=new Thread(new ThreadStart(startThread)); 
           th.start();
       }   
       private startThread()
       {
           if(null != ThreadExeEvent)
            {
                ThreadExeEvent();//你的线程函数
                  if(null != AfterThreadExeEvent)
                 {
                    AfterThreadExeEvent();//你线程结束时的函数
                 }
            }
       }   
    }
      

  5.   

    在线程里写一个调用外部应用的方法:
    this.BeginInvoke(mydelegate, new object[] {i});传一个委托加上你需要的参数信息就ok了。
      

  6.   

    如果是需要等待一个线程结束可以用AutoResetEvent,
    多个的话可以用WatiAll和manulResetEvent.
    参考:
    ManualResetEvent和AutoResetEvent用法小试
      

  7.   

    public delegate void ThreadExeHandler(); 
    public ThreadExeHandler eventHandler;
    private void aaa() 

        //以前是这么写的 
        Thread th=new Thread(new ThreadStart(bbb)); 
        eventHandler = new ThreadExeHandler(ccc);
        th.Start(); 
    } //线程中执行的方法 
    private void bbb() 

        //执行的代码     if(eventHandler!=null) eventHandler.Invoke();
    } //线程结束后执行的方法 
    private void ccc() 

        //执行的代码 
      

  8.   

    我现在觉得.NET 2.0以上带的BackgroundWorker用起来比自己弄一堆的Thread要爽
      

  9.   

    一种是使用异步回调 Delgate.beginInvoke或者是基于事件驱动的BackgroundWorker
    也可以用同步对象进行控制
      

  10.   

    感谢大家的回复,由于前些日子发生点事情,没有及时给分。刚才对大家回复的内容我做了一下测试。我主要是想 线程结束后 运行某个方法 2楼 这段代码表示的是在线程中运行的ccc()方法,而不是线程结束后我个人还是比较喜欢 13楼说的BackgroundWorker控件,它有一个RunWorkerCompleted()方法,当线程结束后,程序会自动运行它。比较简便易懂。6楼 和 10楼 说的ManualResetEvent,用它也可以实现,但是需要在线程方法的最后做一个运行结束的标记,然后 在主进程中的 线程名.start() 后面用 WaitHandle.WaitAll 一直等待刚才那个标记,然后在执行下面的代码3楼 这段代码是 在线程中的最后引发一个事件,然后执行我那个ccc()方法,但是我觉得还是没有摆脱线程,还是在线程里面,跟2楼是一个意思。4楼 自己做了一个类,类里面运行了一个线程,线程中对于我那个程序来说,运行的顺序是bbb(),然后是ccc(),感觉2个方法确实是分开了,不是以前的嵌套关系了,但是ccc()这个方法还是属于 th 这个线程之内,感觉分离的不是那么明朗。