private ManualResetEvent ManualSet= new ManualResetEvent(true);
private bool blnExitLoop = false;//从Start启动一个线程
Start()
{
   Thread ThDo = new Thread(new ThreadStart(LoopRun));
   ThDo.SetApartmentState(ApartmentState.STA);
   
    ManualSet.WaitOne();
    ManualSet.Reset();   ThDo.Start();
}//循环执行方法A ,方法B
void LoopRun()
{
  While(true)
  {
       //方法A
        A();
        //方法B
        B();       if(blnExitLoop== true) break;
   }
   ManualSet.Set();
}//停止循环
void Stop()
{
    blnExitLoop = true; //用于跳出循环的变量
    
    //在这里等待信号返回,从而继续下面的操作
    ManualSet.WaitOne();
    //........
}先是C# winform前台,启动方法Start();系统前台界面调用stop()方法停止循环操作时,但是在等待信号的时候,stop()方法中,ManualSet.WaitOne()迟迟等不到信号。
跟踪下去,发现在方法A()中设置断点,程序在A()中竟然走不出来了,不知问什么,好像里面进行着死循环似地。但是A()中,没有进行复杂的代码,更没循环操作。所以导致循环好像卡住了。请教各个大虾!!!

解决方案 »

  1.   

    try catch   捕获异常
      

  2.   

    是不是陷入死循环了?还有你的方法起个其他名字,别用Start、Stop这样的容易引起冲突的名词。
      

  3.   

    考虑重新设计你的业务逻辑,不要在线程中出现什么while语句。
      

  4.   

    应该不是while引起的,应该是线程设置方面的问题还是什么,
    有时候出现,有时候正常。
    再说,这种操作是在后台循环执行一个命令,动作是循环操作,
    不把循环放在线程,放哪比较合适呢???
      

  5.   

    private   ManualResetEvent   ManualSet=   new   ManualResetEvent(true); 把那个true改成false试试,然后一开始不要
    ManualSet.WaitOne(); 
    ManualSet.Reset(); 
      

  6.   

    private   ManualResetEvent   ManualSet=   new   ManualResetEvent(true); 
    private   bool   bLoop   =  true; //从Start启动一个线程 
    Start() 

          Thread   ThDo   =   new   Thread(new   ThreadStart(LoopRun)); 
          ThDo.SetApartmentState(ApartmentState.STA); 
          ThDo.Start(); 
    } //循环执行方法A   ,方法B 
    void   LoopRun() 

        While(bLoop) 
        { 
            ManualSet.WaitOne(); 
            if(OK)
            {
                GOGO!
            }
            else
               ManualSet.Reset();       
          } 
    } //停止循环 
    void   Stop() 

            bLoop   =   false;   //用于跳出循环的变量 
            if(ThDo != null && ThDo.islive)
            {
               try{ThDo.about();}
               catch(System.Threading.ThreadAbortException){}
             }
    } void IWantToDoSomething()
    {
       ..... 
       .....
       ManualSet.set(); 
    }
      

  7.   

    private ManualResetEvent ManualSet= new ManualResetEvent(true);  修正private ManualResetEvent ManualSet= new ManualResetEvent(false);  
      

  8.   


    方法A
    void A()
    {
     //通过串口,调用第三方的一些接口,读取数据
     //...
     //一些计算公式,计算这些数据
     //...
     //数据库的一些操作,存储数据
     //...
     //跳出方法
    }所有的上面操作应该是正常的,能够顺利执行。
      

  9.   

    我不是贴给你看了
    线程主塞是   ManualSet.WaitOne(); 
    你在门外叫停、当然没用、
       LoopRun() 还是会跑的乱七八糟的
      

  10.   


    请问 
     if(OK)
      {
      GOGO!
      }
      else
      ManualSet.Reset(); 这个逻辑是什么。有点费解
      

  11.   

    if(条件)
     动作
    else
     ManualSet.Reset(); //暂停线程
     
      

  12.   


    我知道这关键词的意义,我说的意思是在本程序中,行不通
    void LoopRun()  
    {  
      While(bLoop)  
      {  
      ManualSet.WaitOne();  
      if(条件)
      {
      动作
      }
      else
      ManualSet.Reset();   
      }  
    }  
    一开始会在ManualSet.WaitOne();阻塞
    而且上面所说的“条件”是指什么。
    我要执行的是方法A,方法B。
      

  13.   

    我通常用法queue<XXX> queueXXXvoid add(XXX x)
    {
    queueXXX.Enqueue(x);
    ManualSet.set(); 
    }void LoopRun()   
    {   
      While(bLoop)   
      {   
      ManualSet.WaitOne();   
      if(queueXXX.count >0)
      {
           XXX x= queueXXX.Dequeue();
           
      }
      else
      ManualSet.Reset();   
      }   
    }   
      

  14.   

            private ManualResetEvent ManualSet = new ManualResetEvent(false);
            private bool blnExitLoop = false;        Start() 
            {
                Thread ThDo = new Thread(new ThreadStart(LoopRun));
                ThDo.SetApartmentState(ApartmentState.STA);            ThDo.Start();
                ManualSet.WaitOne();
                ManualSet.Reset();
            }        void LoopRun()
            {
                Thread.Sleep(5000);
                ManualSet.Set();
            }
      

  15.   

    千万别用while true,用其他方法解决~