C# 关闭串口 时,程序卡死

number007cool 2019-11-27 04:19:33
串口接收的数据量比较大的时候,点击按钮关闭串口的时候,在执行Close 函数时,程序很容易卡死。

try cath 捕获不到异常,请问怎样解决
...全文
816 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 number007cool 的回复:
[quote=引用 2 楼 啥都不懂所以不当程序猿 的回复:]
https://zhidao.baidu.com/question/1947710909708813028.html
看下这个吧

我串口数据发送不是线程里面做的,串口接收事件回调函数里面弄的 port_ReceiveHandler 。

具体如下:

/// <summary>
/// 打开串口
/// </summary>
/// <param name="portName"></param>
/// <param name="baud"></param>
/// <returns></returns>
public bool openComPort(string portName, string baud)
{
bool ret = false;
if(m_serialPort == null) return false;

try
{
m_serialPort.PortName = portName;
m_serialPort.BaudRate = Convert.ToInt32(baud);
m_serialPort.Open();
m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler);

ret = true;
}
catch(Exception er)
{
MessageBox.Show(er.Message);
}

return ret;
}[/quote]
https://blog.csdn.net/kasama1953/article/details/51768600
看看这篇吧,我觉得你应该是在接收事件里进行了UI操作导致和文章所说的死锁事件一样,于是界面就卡死了
number007cool 2019-11-28
  • 打赏
  • 举报
回复
引用 2 楼 啥都不懂所以不当程序猿 的回复:
https://zhidao.baidu.com/question/1947710909708813028.html 看下这个吧
我串口数据发送不是线程里面做的,串口接收事件回调函数里面弄的 port_ReceiveHandler 。 具体如下: /// <summary> /// 打开串口 /// </summary> /// <param name="portName"></param> /// <param name="baud"></param> /// <returns></returns> public bool openComPort(string portName, string baud) { bool ret = false; if(m_serialPort == null) return false; try { m_serialPort.PortName = portName; m_serialPort.BaudRate = Convert.ToInt32(baud); m_serialPort.Open(); m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler); ret = true; } catch(Exception er) { MessageBox.Show(er.Message); } return ret; }
  • 打赏
  • 举报
回复
https://zhidao.baidu.com/question/1947710909708813028.html
看下这个吧
number007cool 2019-11-28
  • 打赏
  • 举报
回复
关闭代码如下: /// <summary> /// 关闭串口 /// </summary> /// <returns></returns> public bool closeComPort() { if (m_serialPort == null) return false; bool ret = false; try { if(m_serialPort.IsOpen) m_serialPort.Close(); ret = true; } catch(Exception er) { } return ret; }
  • 打赏
  • 举报
回复
引用 6 楼 number007cool的回复:
[quote=引用 4 楼 啥都不懂所以不当程序猿 的回复:] [quote=引用 3 楼 number007cool 的回复:] [quote=引用 2 楼 啥都不懂所以不当程序猿 的回复:] https://zhidao.baidu.com/question/1947710909708813028.html 看下这个吧
我串口数据发送不是线程里面做的,串口接收事件回调函数里面弄的 port_ReceiveHandler 。 具体如下: /// <summary> /// 打开串口 /// </summary> /// <param name="portName"></param> /// <param name="baud"></param> /// <returns></returns> public bool openComPort(string portName, string baud) { bool ret = false; if(m_serialPort == null) return false; try { m_serialPort.PortName = portName; m_serialPort.BaudRate = Convert.ToInt32(baud); m_serialPort.Open(); m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler); ret = true; } catch(Exception er) { MessageBox.Show(er.Message); } return ret; }[/quote] https://blog.csdn.net/kasama1953/article/details/51768600 看看这篇吧,我觉得你应该是在接收事件里进行了UI操作导致和文章所说的死锁事件一样,于是界面就卡死了[/quote] 搞定了,确实是, 正在关闭的时候,就先不要接收数据, 调用关闭函数前,先确保当前没有接收,这样关闭串口很流畅 简要二次封装了一下,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


using System.IO.Ports;
using System.Windows.Forms;



namespace vs_ComHelper
{


    /// <summary>
    /// SerialPort类的二次封装
    /// </summary>
    public class MyCom
    {

        public SerialPort m_serialPort;

        /// <summary>
        /// 正在关闭串口标志量
        /// </summary>
        public bool m_bClosing;
        
        /// <summary>
        ///串口正在接收数据标志量 
        /// </summary>
        public bool m_bReceiving;


        /// <summary>
        /// 定义接收委托类型
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public delegate void delegate_ReceiveHandler(object sender, SerialDataReceivedEventArgs args);

        /// <summary>
        /// 定义接收委托变量
        /// </summary>
        private delegate_ReceiveHandler m_SerailReceiveHandler;

        /// <summary>
        /// 自定义串口类的构造函数
        /// </summary>
        /// <param name="port"></param>
        public MyCom(SerialPort port, delegate_ReceiveHandler handler)
        {
            m_serialPort = port;
            m_SerailReceiveHandler = handler;

            m_bClosing = false;
            m_bReceiving = false;
            m_serialPort.Close();
        }



        /// <summary>
        /// 串口接收处理函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void port_ReceiveHandler(object sender, SerialDataReceivedEventArgs args)
        {  
            if(m_bClosing) return;

            m_bReceiving = true;
            m_SerailReceiveHandler(sender, args);
            m_bReceiving = false;
        }

        /// <summary>
        /// 判断串口是否打开
        /// </summary>
        /// <returns></returns>
        public bool IsOpen()
        {
            return m_serialPort.IsOpen;
        }

        /// <summary>
        /// 打开或者关闭串口
        /// </summary>
        /// <param name="com"></param>
        /// <param name="baud"></param>
        /// <returns></returns>
        public string openOrClose(string com, string baud)
        {
            bool ret = false;

            string str = string.Empty;

            try
            {
                if (m_serialPort.IsOpen == false)
                {
                    ret = openComPort(com, baud);
                }
                else
                {
                    //serialPort1.Close();
                    //serialPort1.DiscardInBuffer();
                    ret = !closeComPort();
                }

            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message);
            }

            if (ret == false)
                str = "打开";
            else
                str = "关闭";


            return str;
        }


        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="portName"></param>
        /// <param name="baud"></param>
        /// <returns></returns>
        public bool openComPort(string portName, string baud)
        {
            bool ret = false;
            if(m_serialPort == null) return false;

            try
            {
                m_serialPort.PortName = portName;
                m_serialPort.BaudRate = Convert.ToInt32(baud);
                m_serialPort.Open();
                m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler);

                ret = true;
            }
            catch(Exception er)
            {
                MessageBox.Show(er.Message);
            }

            return ret;
        }


        /// <summary>
        /// 关闭串口
        /// </summary>
        /// <returns></returns>
        public bool closeComPort()
        {
            if (m_serialPort == null) return false;
            
            bool ret = false;

            try
            {
                if(m_serialPort.IsOpen)
                {
                    m_bClosing = true;

                    //处理Windows消息
                    while (m_bReceiving) Application.DoEvents();
                    m_serialPort.Close();

                    m_bClosing = false;
                }
                   
                ret = true;
            }
            catch(Exception er)
            {

            }

            return ret;
        }


        /// <summary>
        /// 发送字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public bool send(string str)
        {
            if (m_serialPort.IsOpen == false) return false;
            m_serialPort.Write(str);

            return true;
        }


        /// <summary>
        /// 发送16进制数,发送函数重载
        /// </summary>
        /// <param name="byData"></param>
        /// <param name="ofs">发送数据偏移量</param>
        /// <param name="len">发送数据长度</param>
        /// <returns></returns>
        public bool send(byte[] byData, int ofs, int len)
        {
            if (m_serialPort.IsOpen == false) return false;
            m_serialPort.Write(byData, ofs, len);

            return true;
        }



    }
}

多谢[/quote] 哈,我没注意有新的消息过来,解决了就好
  • 打赏
  • 举报
回复
引用 6 楼 number007cool的回复:
[quote=引用 4 楼 啥都不懂所以不当程序猿 的回复:] [quote=引用 3 楼 number007cool 的回复:] [quote=引用 2 楼 啥都不懂所以不当程序猿 的回复:] https://zhidao.baidu.com/question/1947710909708813028.html 看下这个吧
我串口数据发送不是线程里面做的,串口接收事件回调函数里面弄的 port_ReceiveHandler 。 具体如下: /// <summary> /// 打开串口 /// </summary> /// <param name="portName"></param> /// <param name="baud"></param> /// <returns></returns> public bool openComPort(string portName, string baud) { bool ret = false; if(m_serialPort == null) return false; try { m_serialPort.PortName = portName; m_serialPort.BaudRate = Convert.ToInt32(baud); m_serialPort.Open(); m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler); ret = true; } catch(Exception er) { MessageBox.Show(er.Message); } return ret; }[/quote] https://blog.csdn.net/kasama1953/article/details/51768600 看看这篇吧,我觉得你应该是在接收事件里进行了UI操作导致和文章所说的死锁事件一样,于是界面就卡死了[/quote] 搞定了,确实是, 正在关闭的时候,就先不要接收数据, 调用关闭函数前,先确保当前没有接收,这样关闭串口很流畅 简要二次封装了一下,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


using System.IO.Ports;
using System.Windows.Forms;



namespace vs_ComHelper
{


    /// <summary>
    /// SerialPort类的二次封装
    /// </summary>
    public class MyCom
    {

        public SerialPort m_serialPort;

        /// <summary>
        /// 正在关闭串口标志量
        /// </summary>
        public bool m_bClosing;
        
        /// <summary>
        ///串口正在接收数据标志量 
        /// </summary>
        public bool m_bReceiving;


        /// <summary>
        /// 定义接收委托类型
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public delegate void delegate_ReceiveHandler(object sender, SerialDataReceivedEventArgs args);

        /// <summary>
        /// 定义接收委托变量
        /// </summary>
        private delegate_ReceiveHandler m_SerailReceiveHandler;

        /// <summary>
        /// 自定义串口类的构造函数
        /// </summary>
        /// <param name="port"></param>
        public MyCom(SerialPort port, delegate_ReceiveHandler handler)
        {
            m_serialPort = port;
            m_SerailReceiveHandler = handler;

            m_bClosing = false;
            m_bReceiving = false;
            m_serialPort.Close();
        }



        /// <summary>
        /// 串口接收处理函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void port_ReceiveHandler(object sender, SerialDataReceivedEventArgs args)
        {  
            if(m_bClosing) return;

            m_bReceiving = true;
            m_SerailReceiveHandler(sender, args);
            m_bReceiving = false;
        }

        /// <summary>
        /// 判断串口是否打开
        /// </summary>
        /// <returns></returns>
        public bool IsOpen()
        {
            return m_serialPort.IsOpen;
        }

        /// <summary>
        /// 打开或者关闭串口
        /// </summary>
        /// <param name="com"></param>
        /// <param name="baud"></param>
        /// <returns></returns>
        public string openOrClose(string com, string baud)
        {
            bool ret = false;

            string str = string.Empty;

            try
            {
                if (m_serialPort.IsOpen == false)
                {
                    ret = openComPort(com, baud);
                }
                else
                {
                    //serialPort1.Close();
                    //serialPort1.DiscardInBuffer();
                    ret = !closeComPort();
                }

            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message);
            }

            if (ret == false)
                str = "打开";
            else
                str = "关闭";


            return str;
        }


        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="portName"></param>
        /// <param name="baud"></param>
        /// <returns></returns>
        public bool openComPort(string portName, string baud)
        {
            bool ret = false;
            if(m_serialPort == null) return false;

            try
            {
                m_serialPort.PortName = portName;
                m_serialPort.BaudRate = Convert.ToInt32(baud);
                m_serialPort.Open();
                m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler);

                ret = true;
            }
            catch(Exception er)
            {
                MessageBox.Show(er.Message);
            }

            return ret;
        }


        /// <summary>
        /// 关闭串口
        /// </summary>
        /// <returns></returns>
        public bool closeComPort()
        {
            if (m_serialPort == null) return false;
            
            bool ret = false;

            try
            {
                if(m_serialPort.IsOpen)
                {
                    m_bClosing = true;

                    //处理Windows消息
                    while (m_bReceiving) Application.DoEvents();
                    m_serialPort.Close();

                    m_bClosing = false;
                }
                   
                ret = true;
            }
            catch(Exception er)
            {

            }

            return ret;
        }


        /// <summary>
        /// 发送字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public bool send(string str)
        {
            if (m_serialPort.IsOpen == false) return false;
            m_serialPort.Write(str);

            return true;
        }


        /// <summary>
        /// 发送16进制数,发送函数重载
        /// </summary>
        /// <param name="byData"></param>
        /// <param name="ofs">发送数据偏移量</param>
        /// <param name="len">发送数据长度</param>
        /// <returns></returns>
        public bool send(byte[] byData, int ofs, int len)
        {
            if (m_serialPort.IsOpen == false) return false;
            m_serialPort.Write(byData, ofs, len);

            return true;
        }



    }
}

多谢[/quote] 哈,我没注意有新的消息过来,解决了就好
number007cool 2019-11-28
  • 打赏
  • 举报
回复
引用 7 楼 啥都不懂所以不当程序猿 的回复:
[quote=引用 5 楼 number007cool的回复:][quote=引用 4 楼 啥都不懂所以不当程序猿 的回复:] [quote=引用 3 楼 number007cool 的回复:] [quote=引用 2 楼 啥都不懂所以不当程序猿 的回复:] https://zhidao.baidu.com/question/1947710909708813028.html 看下这个吧
我串口数据发送不是线程里面做的,串口接收事件回调函数里面弄的 port_ReceiveHandler 。 具体如下: /// <summary> /// 打开串口 /// </summary> /// <param name="portName"></param> /// <param name="baud"></param> /// <returns></returns> public bool openComPort(string portName, string baud) { bool ret = false; if(m_serialPort == null) return false; try { m_serialPort.PortName = portName; m_serialPort.BaudRate = Convert.ToInt32(baud); m_serialPort.Open(); m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler); ret = true; } catch(Exception er) { MessageBox.Show(er.Message); } return ret; }[/quote] https://blog.csdn.net/kasama1953/article/details/51768600 看看这篇吧,我觉得你应该是在接收事件里进行了UI操作导致和文章所说的死锁事件一样,于是界面就卡死了[/quote] 是的,接收事件里面搞了UI操作,但是通过委托实现的。[/quote] 你看了我给你发的链接的文章吗?对方也是举例一个很普通的串口操作,在接收后用了invoke将数据呈现在ui上的datagridview上,然后在关闭串口的时候导致了死锁[/quote] /// <summary> /// 关闭串口 /// </summary> /// <returns></returns> public bool closeComPort() { if (m_serialPort == null) return false; bool ret = false; try { if(m_serialPort.IsOpen) { m_bClosing = true; //处理Windows消息 while (m_bReceiving) Application.DoEvents(); m_serialPort.Close(); m_bClosing = false; } ret = true; } catch(Exception er) { } return ret; } 这里的操作就是参考那边思路来的
  • 打赏
  • 举报
回复
引用 5 楼 number007cool的回复:
[quote=引用 4 楼 啥都不懂所以不当程序猿 的回复:] [quote=引用 3 楼 number007cool 的回复:] [quote=引用 2 楼 啥都不懂所以不当程序猿 的回复:] https://zhidao.baidu.com/question/1947710909708813028.html 看下这个吧
我串口数据发送不是线程里面做的,串口接收事件回调函数里面弄的 port_ReceiveHandler 。 具体如下: /// <summary> /// 打开串口 /// </summary> /// <param name="portName"></param> /// <param name="baud"></param> /// <returns></returns> public bool openComPort(string portName, string baud) { bool ret = false; if(m_serialPort == null) return false; try { m_serialPort.PortName = portName; m_serialPort.BaudRate = Convert.ToInt32(baud); m_serialPort.Open(); m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler); ret = true; } catch(Exception er) { MessageBox.Show(er.Message); } return ret; }[/quote] https://blog.csdn.net/kasama1953/article/details/51768600 看看这篇吧,我觉得你应该是在接收事件里进行了UI操作导致和文章所说的死锁事件一样,于是界面就卡死了[/quote] 是的,接收事件里面搞了UI操作,但是通过委托实现的。[/quote] 你看了我给你发的链接的文章吗?对方也是举例一个很普通的串口操作,在接收后用了invoke将数据呈现在ui上的datagridview上,然后在关闭串口的时候导致了死锁
number007cool 2019-11-28
  • 打赏
  • 举报
回复
引用 4 楼 啥都不懂所以不当程序猿 的回复:
[quote=引用 3 楼 number007cool 的回复:] [quote=引用 2 楼 啥都不懂所以不当程序猿 的回复:] https://zhidao.baidu.com/question/1947710909708813028.html 看下这个吧
我串口数据发送不是线程里面做的,串口接收事件回调函数里面弄的 port_ReceiveHandler 。 具体如下: /// <summary> /// 打开串口 /// </summary> /// <param name="portName"></param> /// <param name="baud"></param> /// <returns></returns> public bool openComPort(string portName, string baud) { bool ret = false; if(m_serialPort == null) return false; try { m_serialPort.PortName = portName; m_serialPort.BaudRate = Convert.ToInt32(baud); m_serialPort.Open(); m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler); ret = true; } catch(Exception er) { MessageBox.Show(er.Message); } return ret; }[/quote] https://blog.csdn.net/kasama1953/article/details/51768600 看看这篇吧,我觉得你应该是在接收事件里进行了UI操作导致和文章所说的死锁事件一样,于是界面就卡死了[/quote] 搞定了,确实是, 正在关闭的时候,就先不要接收数据, 调用关闭函数前,先确保当前没有接收,这样关闭串口很流畅 简要二次封装了一下,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


using System.IO.Ports;
using System.Windows.Forms;



namespace vs_ComHelper
{


    /// <summary>
    /// SerialPort类的二次封装
    /// </summary>
    public class MyCom
    {

        public SerialPort m_serialPort;

        /// <summary>
        /// 正在关闭串口标志量
        /// </summary>
        public bool m_bClosing;
        
        /// <summary>
        ///串口正在接收数据标志量 
        /// </summary>
        public bool m_bReceiving;


        /// <summary>
        /// 定义接收委托类型
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public delegate void delegate_ReceiveHandler(object sender, SerialDataReceivedEventArgs args);

        /// <summary>
        /// 定义接收委托变量
        /// </summary>
        private delegate_ReceiveHandler m_SerailReceiveHandler;

        /// <summary>
        /// 自定义串口类的构造函数
        /// </summary>
        /// <param name="port"></param>
        public MyCom(SerialPort port, delegate_ReceiveHandler handler)
        {
            m_serialPort = port;
            m_SerailReceiveHandler = handler;

            m_bClosing = false;
            m_bReceiving = false;
            m_serialPort.Close();
        }



        /// <summary>
        /// 串口接收处理函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void port_ReceiveHandler(object sender, SerialDataReceivedEventArgs args)
        {  
            if(m_bClosing) return;

            m_bReceiving = true;
            m_SerailReceiveHandler(sender, args);
            m_bReceiving = false;
        }

        /// <summary>
        /// 判断串口是否打开
        /// </summary>
        /// <returns></returns>
        public bool IsOpen()
        {
            return m_serialPort.IsOpen;
        }

        /// <summary>
        /// 打开或者关闭串口
        /// </summary>
        /// <param name="com"></param>
        /// <param name="baud"></param>
        /// <returns></returns>
        public string openOrClose(string com, string baud)
        {
            bool ret = false;

            string str = string.Empty;

            try
            {
                if (m_serialPort.IsOpen == false)
                {
                    ret = openComPort(com, baud);
                }
                else
                {
                    //serialPort1.Close();
                    //serialPort1.DiscardInBuffer();
                    ret = !closeComPort();
                }

            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message);
            }

            if (ret == false)
                str = "打开";
            else
                str = "关闭";


            return str;
        }


        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="portName"></param>
        /// <param name="baud"></param>
        /// <returns></returns>
        public bool openComPort(string portName, string baud)
        {
            bool ret = false;
            if(m_serialPort == null) return false;

            try
            {
                m_serialPort.PortName = portName;
                m_serialPort.BaudRate = Convert.ToInt32(baud);
                m_serialPort.Open();
                m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler);

                ret = true;
            }
            catch(Exception er)
            {
                MessageBox.Show(er.Message);
            }

            return ret;
        }


        /// <summary>
        /// 关闭串口
        /// </summary>
        /// <returns></returns>
        public bool closeComPort()
        {
            if (m_serialPort == null) return false;
            
            bool ret = false;

            try
            {
                if(m_serialPort.IsOpen)
                {
                    m_bClosing = true;

                    //处理Windows消息
                    while (m_bReceiving) Application.DoEvents();
                    m_serialPort.Close();

                    m_bClosing = false;
                }
                   
                ret = true;
            }
            catch(Exception er)
            {

            }

            return ret;
        }


        /// <summary>
        /// 发送字符串
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public bool send(string str)
        {
            if (m_serialPort.IsOpen == false) return false;
            m_serialPort.Write(str);

            return true;
        }


        /// <summary>
        /// 发送16进制数,发送函数重载
        /// </summary>
        /// <param name="byData"></param>
        /// <param name="ofs">发送数据偏移量</param>
        /// <param name="len">发送数据长度</param>
        /// <returns></returns>
        public bool send(byte[] byData, int ofs, int len)
        {
            if (m_serialPort.IsOpen == false) return false;
            m_serialPort.Write(byData, ofs, len);

            return true;
        }



    }
}

多谢
number007cool 2019-11-28
  • 打赏
  • 举报
回复
引用 4 楼 啥都不懂所以不当程序猿 的回复:
[quote=引用 3 楼 number007cool 的回复:] [quote=引用 2 楼 啥都不懂所以不当程序猿 的回复:] https://zhidao.baidu.com/question/1947710909708813028.html 看下这个吧
我串口数据发送不是线程里面做的,串口接收事件回调函数里面弄的 port_ReceiveHandler 。 具体如下: /// <summary> /// 打开串口 /// </summary> /// <param name="portName"></param> /// <param name="baud"></param> /// <returns></returns> public bool openComPort(string portName, string baud) { bool ret = false; if(m_serialPort == null) return false; try { m_serialPort.PortName = portName; m_serialPort.BaudRate = Convert.ToInt32(baud); m_serialPort.Open(); m_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_ReceiveHandler); ret = true; } catch(Exception er) { MessageBox.Show(er.Message); } return ret; }[/quote] https://blog.csdn.net/kasama1953/article/details/51768600 看看这篇吧,我觉得你应该是在接收事件里进行了UI操作导致和文章所说的死锁事件一样,于是界面就卡死了[/quote] 是的,接收事件里面搞了UI操作,但是通过委托实现的。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧