当前位置:编程学习 > C#/ASP.NET >>

如何处理可能会引起死循环的函数?

class A
{
public static Main()
{
for(int i=0;i<10;i++)
DLL.B();//函数B是从DLL这个外部dll中引入的,该函数可能出现死循环而无法跳出的情况
}
}

我想知道怎么样才能保证程序能正常执行完十次循环而不会死在一半了?我自己的想法是设置一个timer,并新建一个线程来执行B(),每次线程开始timer即开始计时,timeout之后强制结束测试线程,继续下一次循环,问题是我这样做每次都退不出B()的线程。求大牛帮忙解决或提供更好的解决方法,拜谢~ --------------------编程问答-------------------- 帮LZ顶起,等大牛 --------------------编程问答-------------------- 想法是对的,代码贴出来。 --------------------编程问答-------------------- 可以考虑在新线程的处理中增加ManuResetEvent
如:
 ManuResetEvent _P=new ....;
 private bool DoB()
 {
   _P.Reset();
   Thread u = new Thread(new ThreadStart(TDoB);
   thread.Start();
   if(_P.WaitOne(10000)) 
      return true; 
    else
      return false;    
 }

 private void TDoB()
 {  
   Dll.B();
   _P.Set();   
 } --------------------编程问答-------------------- _P.WaitOne()失败时可以尝试去处理终止线程 --------------------编程问答--------------------
引用 3 楼 etudiant6666 的回复:
可以考虑在新线程的处理中增加ManuResetEvent
如:
 ManuResetEvent _P=new ....;
 private bool DoB()
 {
   _P.Reset();
   Thread u = new Thread(new ThreadStart(TDoB);
   thread.Start();
   if(_P.WaitOne(10000)) ……


顶下,我也是这么处理的。 --------------------编程问答-------------------- 为何不考虑用
do..while.. --------------------编程问答--------------------
引用 3 楼 etudiant6666 的回复:
可以考虑在新线程的处理中增加ManuResetEvent
如:
 ManuResetEvent _P=new ....;
 private bool DoB()
 {
   _P.Reset();
   Thread u = new Thread(new ThreadStart(TDoB);
   thread.Start();
   if(_P.WaitOne(10000)) ……
强 --------------------编程问答-------------------- ManualResetEvent WaitHandler.
Set()
Reset();


http://www.cnblogs.com/heaiping/archive/2010/08/01/1789828.html

--------------------编程问答-------------------- 用do....while... --------------------编程问答-------------------- DLL能做出死循环来, 失败啊. --------------------编程问答-------------------- 强制结束不是一个太好的主意.
强制结束时你无法确认B执行到了哪儿.
很可能会造成内存泄露.
当然在没有办法控制B的流程的情况下.
强制结束是没有办法的办法.

其实我觉得最好的办法是....
把写Dll.B的人揪出来打屁股 --------------------编程问答-------------------- class A
{
    public static Main()
    {
        for(int i=0;i<10;i++)
         {
            Thread u = new Thread(new ThreadStart(delegate()
               ( 
                 DLL.B();
               )
            );
            thread.Start();

        }
     }
}
不知道什么特殊需要你让你冒着程序崩溃的危险,调用会死循的函数.但是如果你像上面的代码一样启动10条线程应该会解决你的问题.我在这里不可能写太多代码,如果你非要启动10条线程建议你做一个线程池,这样会很大程度上解决你程序崩溃的问题.
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,