0

我想从端口获取信号,我使用这些函数来接收数据,但有时我会在 thread.join() 线上遇到这个异常:

System.IO.IOException 未处理

Message="由于线程退出或应用程序请求,I/O 操作已中止。

当我插入断点并对其进行调试时,它一直正确,直到上线 thread.join() 然后 UI 停止并且什么都没有发生。

同样,当我在发布模式下运行程序时,它可以正常工作,但问题出在调试模式下,出了什么问题以及如何解决这个问题?

谢谢。

    public SignalReader()
    {
        thread = new Thread(new ThreadStart(ThreadMain));
    }
    public void Start(string portName, int rate)
    {
        Stop();
        try
        {
            port = new SerialPort(portName, rate);
            port.Open();
        }
        catch
        {
            ;
        }
        thread.Start();
    }
    public void Stop()
    {

        try
        {
            if (port != null)
            {
                if (port.IsOpen) port.Close();
                if (thread.IsAlive) thread.Join();
                port.Dispose();
                port = null;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("4:" + ex.ToString());
        }
    }

当我交换关闭端口并加入线程的顺序时:

...
thread.Join();
port.Close();
...

同样的故事也存在。

4

2 回答 2

0

您正在猛拉地板垫,在使用时关闭端口。最典型的是在 SerialPort.Read() 调用中。所以,是的,那个电话会失败,没有地板垫了。缺少的是一个捕获该异常并让线程优雅结束的 catch 块。并完成 Join() 调用。

这样做并不完全不寻常,只要您可以确保线程实际上阻塞了这样的 Read 调用。这通常不是很难保证。但肯定会担心在 Release 版本中没有出现该异常,这是不正常的。使用调试器的 Debug + Window + Threads 查看该工作线程中发生了什么。

因此,只需添加所需的 try/catch 即可解决您的问题。使用 SerialPort.DataReceived 事件是一种完全不同的方法。根本不清理,只需将线程的 IsBackground 属性设置为 true 以便在程序终止时它会自动死亡,这也是一个完全可以接受的解决方案。

于 2013-09-09T18:23:22.410 回答
0

您收到的错误是因为您使用的 Stop() :

public void Start(string portName, int rate)
    {
        Stop();
        try
        {
            port = new SerialPort(portName, rate);
            port.Open();
        }
        catch
        {
            ;
        }
        thread.Start();
    }

该应用程序已经在做某事,当您调用它时,它会关闭某个端口正在某处使用。

Start尝试删除它,如果端口未关闭,您将在方法中获得异常。它会让您更好地了解此错误的来源。你也可以粘贴你使用这些方法的代码部分吗?

于 2013-09-09T17:16:12.013 回答