线程A启动线程B,B中定义的delegate函数指向A中某函数A_Delegate(),A终止B线程时:A_StopB() {
  m_B.m_eventBeKilled.Set();//让线程B退出循环。其中m_B定义:private Class_B m_B;  m_threadOfObjectB.Join(); //等B退出。
                            //其中m_threadOfObjectB的定义:private Thread m_threadMtThread;
                            //m_threadOfObjectB= new Thread(new ThreadStart(m_B.Begin));
}B在退出时调用了回调函数,指向A的A_Delegate(),此时A的A_StopB中Join()与A_Delegate()死锁。大家给看看。

解决方案 »

  1.   

    就你的功能,其实线程已经结束,不要用Join来等待如果为了其他操作,可以用信号量来进行传递
    例如:
    private Mutex mWork = new Mutex();//In sub-thread b
    mWork.WaitOne();
    //do some work heremWork.ReleaseMutex();//In sub-thread a
    myWork.WaitOne();//Wait for sub-thread b finished
    //Call other function
      

  2.   

    B线程循环检测m_eventBeKilled,当A发出m_B.m_eventBeKilled.Set()时,B就准备结束线程。但B退出时调用了回调函数,函数指向A中A_Delegate()。此时线程A处在Join()语句,等B结束完,而B在等A的A_Delegate()执行完成,出现死锁。A必须等B结束后才可以再往下进行,例如准备退出进程等。
      

  3.   

    to A必须等B结束后才可以再往下进行,例如准备退出进程等。那么你按照我写就行,当线程函数运行结束,意味着线程已经结束了,所以没有必要向你这么复杂的嵌套调用。
      

  4.   

    Knight94(愚翁):您的做法只是可以正确退出线程b,可我要做的不仅是正确退出。线程b要通过委托调用a的某函数。当a发出退出命令让b退出后,b还要先等a执行托管函数后才退出.可这时候a在执行waitone,与执行回调函数死锁.
      

  5.   

    http://msdn2.microsoft.com/en-us/library/2e08f6yc.aspx
      

  6.   

    to 线程b要通过委托调用a的某函数。当a发出退出命令让b退出后,b还要先等a执行托管函数后才退出.可这时候a在执行waitone,与执行回调函数死锁.你这样的做法就是不合理的,修正方法要么改成和我上面所写一样,或者类似的方法;要么用异步委托调用。
      

  7.   

    to:
    jiangsheng(蒋晟.Net[MVP]) ,您的方法找时间偶仔细看看.先谢啦.
    to:
    Knight94(愚翁) ,"你这样的做法就是不合理的",我的主线程a是一个form,我是想在主线程的托管函数里输出一些信息到一个listview,线程b在调用委托函数时传递一个字符串,托管函数输出到界面,那怎么输出子线程信息到界面比较合理?