程序比较长,麻烦大家了。谢谢!
我得程序:
//启动线程
public  void PrepareRunThread(){
for(int nPortIndex=0;nPortIndex < VarDeclare.arrayPorts.Count;nPortIndex++)
{
     //启动线程
     objComThread = new Thread(new ThreadStart(ComOper));
     objComThread.Name = ReturnCom(objPort.Portid);
     objComThread.Start();
     SysLog.log("Log.txt",ReturnCom(objPort.Portid)+"采集线程启动"); 
     Thread.Sleep(5);//阻塞当前线程,启动新建立的线程
     

  }
}////////////////////////////////////////////////////////////////////////////////////
以下是线程执行得内容:private void Oper()
{
  while(!objMRE.WaitOne(0,false))//看一下是不是有结束线程的信
  try
  {
  //轮寻发送
  for(int nTermIndex = 0;nTermIndex < objPort.arrayTerms.Count;nTermIndex++)
  {
   //锁定arrayTermList,防止其它线程进来
   lock(objPort.arrayTerms.SyncRoot)
   {
     objTermVar = (TermVar)objPort.arrayTerms[nTermIndex];
     //先发送命令列表中的帧。
     if(objTermVar.arrayCmdList.Count > 0)
     {
      //命令列表中的当前帧
      frameType = (VarDeclare.structFrameType)objTermVar.arrayCmdList[0];
      //组帧
      byteSendData = objMakeFrames.MakeFrame(ref objTermVar,frameType.enumTransFrameType);
      if(!ComBaseOper.Write(byteSendData)
      {
            continue;
       }
        else
        {
          SendStatus("发送成功");
         }
if(!ManagerCmdList(ref objTermVar,frameType.enumTransFrameType,nTermIndex,ref objPort.arrayTerms))
{
          continue;
}
}else
{
if(VarDeclare.nOnLine != 1)
         {
//向终端机发送请求。
//发送帧.如果失败接着发送下一个终端机
if(!ComBaseOper.Write(byteSendData))
{
//收集出错的终端信息
ErrTermInfo(objTermVar);
}
         }
else
{
Thread.Sleep(1);
continue;
}
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
问题是:如果有大于两个线程得情况(也就是VarDeclare.arrayPorts>1)时,第一个线程只执行一次,然后就一直执行第二个线程。我想要得是他们两个轮替执行呀!

解决方案 »

  1.   

    在lock语句前面,加一个Thread.Sleep(1) 可能两个循环之间时间太短,导致线程调度不灵。
      

  2.   

    在 lock 语句前加  Thread.Sleep(1);
      

  3.   

    objComThread = new Thread(new ThreadStart(ComOper));  //我觉得可能出现在这句上,你把COMOPER的代码贴出来大家看看!
      

  4.   

    Oper()就是ComOper得内容,我把名字改了。
      

  5.   

    你的程序在PrepareRunThread中去调用Thread.Sleep(5),然后想要达到阻塞当前的线程,是不对,你这样做,只会阻塞主线程。
      

  6.   

    //++++++++++++++++++++++++++++++++++++++++++
    Monitor.Enter(this);
    //++++++++++++++++++++++++++++++++++++++++++
    for(int nPortIndex=0;nPortIndex < VarDeclare.arrayPorts.Count;nPortIndex++)
    {
         //启动线程
         objComThread = new Thread(new ThreadStart(ComOper));
         objComThread.Name = ReturnCom(objPort.Portid);
         objComThread.Start();
         SysLog.log("Log.txt",ReturnCom(objPort.Portid)+"采集线程启动"); 
         Thread.Sleep(5);//阻塞当前线程,启动新建立的线程
         
      }
    //+++++++++++++++++++++++++++++++++++
    Monitor.Exit(this);
      

  7.   

    或者使用
    mutex.WaitOne();...mutex.Close();
    试试。