解决方案 »

  1.   

    http://www.cnblogs.com/sufei/p/3145333.html
      

  2.   


    displayInfo里只是简单的对界面上的TextBox进行更新,显示串口接收到的数据
      

  3.   


    不知道Invoke委托的方法执行完毕后是不是要通知调用Invoke的线程(即引发sp1_DataReceived事件的线程),而sp1又被关闭了,导致通知对象无响应,于是界面卡死。这也只是我的猜想
      

  4.   

    当SerialPort关闭的时候,displayInfo里面报错了。但很不幸又被你catch了,
    所以错误没显示,只是一直假死。
      

  5.   


    问题不在这。。displayInfo里是没有错误的,而且如果被catch的话,我在catch那加了MessageBox,并无消息框显示。
      

  6.   

    不要用ivoke,invoke还是在同一线程,用begininvoke
      

  7.   


    Invoke是委托到主线程上的不然就会出现跨线程错误了,只是Invoke是同步委托,BeginInvoke是异步委托
      

  8.   


    曹版主,帮忙解答下,前两天在另外个帖子看到你对Invoke的解释,但没看到更多的了
    Invoke是怎么执行的,执行完毕后是不是通过消息传递什么的displayInfo里的东西很简单,就是像textBox1.Text=Speed.ToString()这种,而Speed是Int型的类成员
      

  9.   

    关闭sp1的时候会造成界面卡死,我想知道原因是什么,是对UI的抢占造成死锁?
    执行sp1.Close()也会对UI进行抢占吗?程序卡死之后,全部中断发现卡在“sp1.Close()”
    解决卡死的问题就是加个
    while(listening)
       Application.DoEvents();
    bool closePort=false,listening=false;
    private void btnOpen_Click(object sender, EventArgs e)
    {                if (btnOpen.Text == "开始监测")
                    {
                        sp1.Open();
                        closePort = false;
                        sp1.Write(inquireCommand, 0, 4);
                        btnOpen.Text = "停止监测";
                    }
                    else if (btnOpen.Text == "停止监测")
                    {
                        closePort = true;
                        while (listening)
                            Application.DoEvents();
                        sp1.Close();                    btnOpen.Text = "开始监测";
                    }
    } private void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
     listening=true;
     ...
     this.Invoke(new EventHandler(displayInfo));
     listening=false;
    }private void displayInfo(object sender, EventArgs e)
    {
      textBox.text=speed.ToString();
    }}
      

  10.   

    谢谢这个帖子解决了我的问题,我试了下Invoke和BeginInvoke都能正常运行,到底用哪个好点呢?
    我给你留言了!
      

  11.   

    BeginInvoke是异步调用,如果你在调用之后不需要什么其他的反馈,同时又想继续执行下面的代码,可以使用异步调用
      

  12.   

    虽然没有满意答案,还是结贴给分吧,我猜测是辅助线程和主线程对UI抢占造成界面卡死。辅助线程里对UI进行操作,而主线程里对SerialPort执行Close操作,造成界面卡死。解决办法我已经在上面贴出来了。