线程中一旦产生错误就死锁,跳不出来。如何搞

线程中一旦产生异常就死锁,跳不出来。怎么搞?

 isGoon = false;  //线程控制开关
            lock (EntryTable) //锁定当前线程
            {
                isGoon = true; //线程控制开关
                dEntry.Path = "LDAP://" + ouLDAP;
                EntryTable.Clear();
                try
                {

                    foreach (DirectoryEntry de in dEntry.Children)
                    {               
                        EntryTable.Add(new MemberInfo(tname, tSchemaClassName, tdistinguishedName, tuserAccountControl));
                        if (isGoon == false) break; //停止循环,当有新任务触发时                                
                    } 
                }
                catch (Exception ex) { return;//加不加都一样
 }                
            }           

问题是这样的,如果有新线程进来,开关isGoon 就设置成false,这时上一个线程在循环中就会结束,新的线程开始锁定变量EntryTable。变量EntryTable是我锁定的对象,每次执行要保证同时只有一个线程能访问它,问题是如果foreach时一旦发生异常,EntryTable就会始终被锁定, 哪怕catch这里使用return都不行。我也是经过好多调试才找到原因。

有无办法解决,谢谢。
------解决思路----------------------
你在其他地方、或者其他线程对EntryTable加了锁才会导致这样的问题
------解决思路----------------------
lock即便出现异常,不加trycatch,也总是能保证解锁的
------解决思路----------------------
你的 EntryTable 是个什么对象
从你现在的代码中 看不出有死锁的迹象
死锁 一般发送在 线程等待 目标锁 被释放的时候
而你 lock (object) { } 这样的写法 代码 一跳出花括号 就会释放 object 所以看不出有死锁的情况
还有这样一种情况 两个锁 相互等待释放
线程1:
lock (object1){
    //此时代码在这里
    lock(object2) {}
}
线程2:
lock (object2){
    //此时代码在这里
    lock (object1) {}
}
这样的话 线程1 等待 object2 被释放才能继续  而线程2 需要等待 object1 被释放才能继续 而object1被线程1占用这 object2 被线程2占用着 他们永远也等待不了继续执行了
所以 你确定 你的代码中 只有锁一个对象? 还是你代码逻辑问题
------解决思路----------------------
你肯定不只这一个锁,从你给的代码看不出死锁的可能。