日期:2014-05-17  浏览次数:21414 次

一个关于多线程无故出现线程死掉的问题
全部代码就不上传上来了 我就描述一下我出现的情况吧!

public class WorkPool{
public delegate void WorkEndHandler(....);
public event WorkEnd;
....
public void AddWork(CallBack callBack,object args){
Thread threadTest = new Thread(() => {
callBack(args);
this.OnWorkEnd(...);
});
threadTest.IsBackground  = true;
threadTest.Start();
}
}

public class WorkManager{
workPool workOne = new WorkPool;
workPool workTwo = new WorkPool;
workOnew.WorkEnd += new WorkEndHandler(WorkEnd);
workOnew.WorkEnd += new WorkEndHandler(WorkEnd);

public void AddWork(...){
workOne.AddWork(...);
}

public void WorkEnd(...){
if(/*是从workOne出来的*/) workTwo.AddWork(...);
if(/*是从workTwo出来的*/) workOne.AddWork(...);
}
}

我定义了两个工作的排队
就像去办理业务一样 有可以 你先到柜台一去办理 然后 可能中途要切换一些柜台才能办理完你的业务
我的代码就是这个意思
WorkManager 添加一个工作的时候 先到WorkOne去 可能根据情况会到WorkTwo去 而WorkTwo可能 又会到WorkOne去 直到 把自己的业务办理好 就退出
我在WorkPool类里面 一个线程执行完后 触发一个事件  然后根据情况 是否还会在切换到另一个柜台去

但是有时候 会无辜出现一些线程死掉  开始我想的是 因为WorkEnd这个事件是从线程里面触发的 而WorkEnd这个里面 可能又会切换柜台 可能WorkEnd方法一执行完 线程结束 可能在WorkEnd里面切换柜台的动作也被挂掉了 
但是如果是这样的话 那么 我就会全部挂掉啊  现在的情况是 偶尔出现线程不明白的挂掉、、、
求解啊
多线程 callback thread

------解决方案--------------------
线程循环里加Application.DoEvents();试试
------解决方案--------------------
线程同步没作好,导致跨线程参数出错,有没有处理子线程异常的委托?
------解决方案--------------------
if(/*是从workOne出来的*/) workTwo.AddWork(...);
if(/*是从workTwo出来的*/) workOne.AddWork(...);
public event WorkEnd事件加上sender参数就省去判断了,

其次,你AddWork里面怎么NEW了一个新的线程?应该提升到全局变量吧,
是不是嵌套着new线程导致的
------解决方案--------------------
你更改状态的时候要加锁的吧。不加锁很容易出问题。