thread = new Thread(getData);
thread.Start();
 
接收串口数据的方法.
getData        先关串口出现.由于线程退出或应用程序请求,已放弃 I/O 操作。
sp1.Close();
sp1.DiscardInBuffer();
thread.Abort();
先关线程就已关闭 Safe handle
thread.Abort();
sp1.Close();
sp1.DiscardInBuffer();
我改怎么办啊...不出问题把这些关掉.

解决方案 »

  1.   

    invoke getdata为何用线程?!
      

  2.   

    放弃你的“thread.Abort();”这种做法,线程调度的程序自己去结束,就没有问题了。
      

  3.   

    getdata为何用线程?!接收串口的方法我没有用sp自带的那个而是用了一个线程来接收...getdata是一个方法...用来处理接收数据和对数据处理...
      

  4.   


    我现在改成了这个样子.bool tf=true;getdata(){while(tf){接收处理.}}到了需要关闭串口的时候.tf=false;sleep(500);sp1.close();这样的话我用bool来控制读取串口与否就可以thread.Abort()不要了吧.
      

  5.   

    逍遥啊我之前好几个正规的问题都是你解决的谢谢啊tf=false;sleep(500);sp1.close();这样就好了吧
      

  6.   

    基本上,在你的程序中,循环开始有这样类似的代码:if(!tf)
    {
      sp.Close();
      return;
    }这就可以了。而外部调用程序顶多只需要设置tf标志,它没有指责去调用什么sp.Close()。其实它根本不需要知道sp是什么东西,对于sp的操作职责不应该纠缠到两个对象中,专门的设备应该有专门的对象控制。
      

  7.   

    问题是出在 thread.Abort() 这种所谓“停线程”代码,通过使得线程异常来实现,所以永远不要用。毫无疑问地,线程应该自己去停止,而不是由外部让它异常。打个比方吧,外科医生正在动开腹手术的时候,你要终止手术应该让医生有时间给病人缝合上吧。