public material_in()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();


    Thread th=new Thread(new ThreadStart(this.InitComPort));//这个程序读串口数据
th.Start();
th.Join();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

解决方案 »

  1.   

    既然要单开一个线程去读串口的数据,就别再Form初始化的时候去Join了,你可以把线程作为此Form的成员,只在Form关闭的时候或其他地方(即自己想处理的时候)进行处理。
      

  2.   

    其实可以开一个托管,让系统给你调配线程,具体请看MSDN中进程托管
      

  3.   

    Thread th=new Thread(new ThreadStart(this.InitComPort));//这个程序读串口数据
    th.Start();
    th.Join();-->   Thread th=new Thread(new ThreadStart(this.InitComPort));//这个程序读串口数据
    th.Start();不要在Start之后就立即Join,在你需要关闭该线程的时候再去Join
      

  4.   

    在读串口的线程中适当的位置调用System.Threading.Thread.Sleep(毫秒数);
      

  5.   

    suosuoyyy(羊羊) 说的已经正确了,不要Join,你这个函数结束了,InitComPort子线程不会被中止的。不知道你的InitComPort线程是个死循环还是工作一段时间后能够自动退出。反正在工作的过程中,将数据保存起来,比如可以保存到当前对象的一个变量中,就是那个this.然后在主线程中可以读取这个变量。当然要注意互斥,比如用lock(变量)的方法。在子线程退出的方式上也有多种,AutoResetEvent 、ManualResetEvent ,甚至简单起见,lock一个变量,然后用不同的值表示是否要退出即可。
      

  6.   

    你可以在窗体初始化的时候运行采集线程,但不要用Join去等线程结束;你可以在线程入口函数中,等采集结束后,给窗体发送消息或写标志等等,告诉窗体采集完毕;在窗体中,等到线程发送的采集结束消息或标志,再进行保存。