串口打开后,开启接收线程,程序正常运行 serialsReceiveThread = new Thread(new ThreadStart(serialReceive));
 serialsReceiveThread.Start();//开始接收线程当我关闭串口时,应该先停止接收线程,但是报异常了,何解?代码如下:
//根据当前串口对象,来判断操作
            if (comm.IsOpen)
            {
                try
                {
                    serialsReceiveThread.Abort();
                    if (ThreadState.Stopped == serialsReceiveThread.ThreadState)
                    {
                        //打开时点击,则关闭串口
                        comm.Close();
                    }
                }
                catch (Exception ex) 
                {
                    MessageBox.Show(ex.Message);
                }
                
            }

解决方案 »

  1.   

    你终止线程时,线程是否在正常运行,还是已经挂起,你参考 Thread..::.Abort  的msdn看看里面的说明
      

  2.   

    我换成这样   serialsReceiveThread.Suspend(); 运行时,界面不报异常
     
     貌似这样不可取呀 我的接收线程里是个
     
     while(true)
     {}  if (comm.IsOpen)
                {
                    try
                    {
                        serialsReceiveThread.Suspend();
                        if (ThreadState.Stopped == serialsReceiveThread.ThreadState)
                        {
                            //打开时点击,则关闭串口
                            comm.Close();
                        }
                    }
                    catch (Exception ex) 
                    {
                        MessageBox.Show(ex.Message);
                    }
                    
                }
      

  3.   

      serialsReceiveThread.Suspend(); 这方法都已经废除了。做个空判断跳过即可。
      

  4.   


     if (comm.IsOpen)
                {
                    try
                    {
                        //serialsReceiveThread.Suspend();
                        serialsReceiveThread.Abort();
                        comm.Close();                   
                    }
                    catch 
                    {
                        return;
                    }
                    
                }
    上面那样也不行啊还是有下面的异常未处理 System.ObjectDisposedException
      Message=已关闭 Safe handle
      Source=mscorlib
      ObjectName=""
      StackTrace:
           在 Microsoft.Win32.Win32Native.SetEvent(SafeWaitHandle handle)
           在 System.Threading.EventWaitHandle.Set()
           在 System.IO.Ports.SerialStream.AsyncFSCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOverlapped)
           在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
      InnerException: 
      

  5.   

    lz是C板块大神啊。while(true){}可以改成 while(true)
    {  CheckPass();
    //other process
    }在起线程的时候生成一个Dictionary<string, ThreadStatus>string是Thread的唯一标识
    enum ThreadStatus{}里面写上你需要的线程的状态。CheckPass()检测当前线程的状态,根据状态每个线程自身决定自身的运行状态。
      

  6.   


     comm.Close();
     serialsReceiveThread.Abort();
     把这两句掉了个个,就暂时没有问题了,,原来是abort(),在上 呵呵不是最佳办法,测试DEMO 也凑合用 呵呵